文档

Java™ 教程-Java Tutorials 中文版
字符和字节流
Trail: Internationalization
Lesson: Working with Text
Section: Converting Non-Unicode Text

字符和字节流

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 时,将显示以下窗口。显示的字符重复验证两个字符串是否相同:

这是 Stream Converter 程序的屏幕截图

Previous page: Byte Encodings and Strings
Next page: Normalizing Text