字符读取器/写入器FileReader和FileWriter无法读取/写入中文文件但字节读取器/写入器工作正常

时间:2017-02-09 05:50:14

标签: java file-io stream internationalization

我有一个包含中文字符的文件。我编写了一个java代码,它使用FileInputStream / FileOutputStream(Byte Stream)读取此文件并将其写入另一个文件,并且它正常工作。但是当我使用字符流FileReader / FileWriter时问题就出现了。

现在的问题是,如何使用只有8位的字节流能够读取中文字符,因为我所知道的是字节流一次读/写一个字节并使用一个字节我们只能识别ASCII字符(即只有128个字符)。使用16位读/写并具有读/写中文字符能力的字符流(FileReader / FileWriter)无法正确读/写文件。

1 个答案:

答案 0 :(得分:1)

字符编码(或解码)仅在您尝试将字节流转换为字符串(或字符)时适用。 FileInputStream和FileOutputStream将适用于任何字符,因为它们不是字符,而是字节。

当您尝试使用FileReader和FileWriter将文件作为字符读取时,您必须考虑字符编码。查看FileReader中的以下java文档,

  

读取字符文件的便捷类。这个的构造者   class假定默认字符编码和默认字节缓冲区   大小合适。要自己指定这些值,请构造一个   FileInputStream上的InputStreamReader。

现在,如果您正在使用FileReader(类似于FileWriter),它将从正在运行的系统(基于语言环境)中选择默认编码,尤其是在Windows操作系统中。你可以,

  1. 专门将file.encoding参数传递为“UTF-8”
  2. 使用正确的编码构建您自己的InputStream。
  3. 希望这有帮助