文档

Java™教程
隐藏目录
字符和字节流
路径:国际化
课程:处理文本
章节:转换非Unicode文本

字符流和字节流

java.io包提供了一些类,允许你在Unicode字符流和非Unicode文本的字节流之间进行转换。使用InputStreamReader类,你可以将字节流转换为字符流。使用OutputStreamWriter类可以将字符流转换为字节流。下图展示了转换过程:

这个图表示转换过程

当你创建InputStreamReaderOutputStreamWriter对象时,你需要指定要转换的字节编码。例如,要将以UTF-8编码的文本文件转换为Unicode,可以按照以下方式创建InputStreamReader

FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");

如果省略编码标识符,InputStreamReaderOutputStreamWriter将使用默认编码。你可以通过调用getEncoding方法来确定InputStreamReaderOutputStreamWriter使用的编码,如下所示:

InputStreamReader defaultReader = new InputStreamReader(fis);
String defaultEncoding = defaultReader.getEncoding();

以下示例展示了如何使用InputStreamReaderOutputStreamWriter类执行字符集转换。完整的示例代码在StreamConverter.java中。这个程序显示了日文字符。在尝试之前,请确保系统上安装了适当的字体。如果你使用与1.1版本兼容的JDK软件,请复制font.properties文件,然后用font.properties.ja文件替换它。

StreamConverter程序将一个String对象中的一系列Unicode字符转换为UTF-8编码的字节,并写入到FileOutputStream中。执行转换的方法名为writeOutput

static void writeOutput(String str) {
    try {
        FileOutputStream fos = new FileOutputStream("test.txt");
        Writer out = new OutputStreamWriter(fos, "UTF8");
        out.write(str);
        out.close();
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
}

readInput方法从由writeOutput方法创建的文件中读取以UTF-8编码的字节。一个InputStreamReader对象将UTF-8编码的字节转换为Unicode,并将结果以String的形式返回。以下是readInput方法的代码:

static String readInput() {
    StringBuffer buffer = new StringBuffer();
    try {
        FileInputStream fis = new FileInputStream("test.txt");
        InputStreamReader isr = new InputStreamReader(fis, "UTF8");
        Reader in = new BufferedReader(isr);
        int ch;
        while ((ch = in.read()) > -1) {
            buffer.append((char)ch);
        }
        in.close();
        return buffer.toString();
    } 
    catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

StreamConverter程序的main方法调用writeOutput方法来创建一个以UTF-8编码的字节文件。readInput方法读取同一个文件,将字节转换回Unicode。以下是main方法的代码:

public static void main(String[] args) {
    String jaString = new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217");
    writeOutput(jaString); 
    String inputString = readInput();
    String displayString = jaString + " " + inputString;
    new ShowString(displayString, "Conversion Demo");
}

原始字符串(jaString)应该与新创建的字符串(inputString)相同。为了显示这两个字符串相同,程序将它们连接在一起,并使用ShowString对象显示出来。ShowString类使用Graphics.drawString方法显示字符串。该类的源代码在ShowString.java中。当StreamConverter程序实例化ShowString时,将显示以下窗口。重复显示的字符证明了这两个字符串是相同的:

这是StreamConverter程序的屏幕截图

上一页:字节编码和字符串
下一页:文本规范化