【问题标题】:Character reader/writer FileReader and FileWriter not able to read/write a chinese file but a Byte Reader/Writer working fine字符读取器/写入器 FileReader 和 FileWriter 无法读取/写入中文文件,但字节读取器/写入器工作正常
【发布时间】:2017-06-27 00:27:47
【问题描述】:

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

现在的问题是,为什么只使用八位的字节流能够读取中文字符,因为我知道字节流一次读取/写入一个字节,而使用一个字节我们只能识别 ASCII 字符(即只有 128 个字符)。使用 16 位读/写并具有读/写汉字能力的字符流(FileReader/FileWriter)不能正确读/写文件。

【问题讨论】:

  • 您应该向我们展示您的代码,但是请注意FileInputStream 并不关心您的文件存储什么,它会复制原始字节;当您打开已复制到您正在使用的工具(比方说记事本)的文件时,正在应用将这些字节转换为人类可读文本的编码。
  • @Eugene 好的。现在假设每个汉字在文件中存储为两个字节,字节流读取器/写入器一次读取一个字节并将其写入另一个文件,最后工具(记事本++)将其转换为人类可读的形式(即合并两个字节形成一个汉字)。但是字符流有什么问题,它也是一次读取和写入两个字节到文件,工具(notepad++)应该将它转换成人类可读的形式。
  • 不一定是两个字节,可能更多;例如代理对。几乎可以肯定您的编码错误,请参阅此处以获取提示:stackoverflow.com/questions/13350676/…

标签: java file-io stream internationalization


【解决方案1】:

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

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

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

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

  1. 具体将 file.encoding 参数传递为“UTF-8”
  2. 使用适当的编码构造您自己的 InputStream。

希望对你有帮助

【讨论】:

  • 强调一下,如果你在做文本处理,不要使用 FileInputStream(除非你有一些需要避免 Java 的文本处理类)。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多