字符和字节流
java.io
包提供了一些类,这些类使您可以在 Unicode 字符流和非 Unicode 文本的字节流之间进行转换。使用InputStreamReader类,可以将字节流转换为字符流。您可以使用OutputStreamWriter类将字符流转换为字节流。下图说明了转换过程:
创建InputStreamReader
和OutputStreamWriter
对象时,请指定要转换的字节编码。例如,要将 UTF-8 编码的文本文件转换为 Unicode,可以创建InputStreamReader
,如下所示:
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
如果省略编码标识符,则InputStreamReader
和OutputStreamWriter
依赖默认编码。您可以通过调用getEncoding
方法来确定InputStreamReader
或OutputStreamWriter
使用哪种编码,如下所示:
InputStreamReader defaultReader = new InputStreamReader(fis);
String defaultEncoding = defaultReader.getEncoding();
下面的示例向您展示如何使用InputStreamReader
和OutputStreamWriter
类执行字符集转换。此示例的完整源代码在StreamConverter.java中。该程序显示日语字符。在try之前,请确认您的系统上已经安装了适当的字体。如果您使用的是与版本 1.1 兼容的 JDK 软件,请复制font.properties
文件,然后将其替换为font.properties.ja
文件。
StreamConverter
程序将 Unicode 字符序列从String
对象转换为以 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
时,将出现以下窗口。重复显示的字符可验证两个字符串 是否相同: