字符和字节流

原文: https://docs.oracle.com/javase/tutorial/i18n/text/stream.html

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

This figure represents the conversion process

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

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

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

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

下面的示例显示如何使用InputStreamReaderOutputStreamWriter类执行字符集转换。此示例的完整源代码位于 StreamConverter.java 中。该程序显示日文字符。在尝试之前,请验证系统上是否安装了相应的字体。如果您使用的是与 1.1 版兼容的 JDK 软件,请复制font.properties文件,然后将其替换为font.properties.ja文件。

StreamConverter程序将String对象的 Unicode 字符序列转换为以 UTF-8 编码的字节的FileOutputStream。执行转换的方法称为writeOutput

  1. static void writeOutput(String str) {
  2. try {
  3. FileOutputStream fos = new FileOutputStream("test.txt");
  4. Writer out = new OutputStreamWriter(fos, "UTF8");
  5. out.write(str);
  6. out.close();
  7. }
  8. catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. }

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

  1. static String readInput() {
  2. StringBuffer buffer = new StringBuffer();
  3. try {
  4. FileInputStream fis = new FileInputStream("test.txt");
  5. InputStreamReader isr = new InputStreamReader(fis, "UTF8");
  6. Reader in = new BufferedReader(isr);
  7. int ch;
  8. while ((ch = in.read()) > -1) {
  9. buffer.append((char)ch);
  10. }
  11. in.close();
  12. return buffer.toString();
  13. }
  14. catch (IOException e) {
  15. e.printStackTrace();
  16. return null;
  17. }
  18. }

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

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

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

This is a screens hot of the StreamConverter program