该Java教程适用于JDK 8。本页面中描述的示例和实践未利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参见JDK发布说明。
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
中。这个程序显示了日文字符。在尝试之前,请确保系统上安装了适当的字体。如果你使用与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
时,将显示以下窗口。重复显示的字符证明了这两个字符串是相同的: