2017-02-09 91 views
1

我有一个具有中国字符的文件。我写了一个读取这个文件并使用FileInputStream/FileOutputStream(字节流)写入另一个文件的Java代码,它工作正常。但是,当我使用字符流FileReader/FileWriter时,问题即将到来。字读/写器的FileReader和FileWriter的无法读/写文件,中国而是字节读/写器工作正常

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

+0

你应该告诉我们你的代码,但* *请注意,'FileInputStream'不关心你的文件存储,它复制原始字节;当您打开已复制到您正在使用的工具(假设记事本)的文件时,正在应用将这些字节转换为人类可读文本的编码。 – Eugene

+0

不一定两个字节,它可能更多;例如,代理对。也几乎可以肯定你所得到的编码错误,在这里看到一个提示:http://stackoverflow.com/questions/13350676/how-to-read-write-this-in-utf-8 – Eugene

回答

1

字符编码(或解码)只有当你试图向字节流转换为字符串(或字符)适用。 FileInputStream和FileOutputStream可以处理任何字符,因为它们不是字符,而是字节。

当你尝试读取文件与使用的FileReader和FileWriter的性格,你必须采取的字符编码考虑。看的FileReader从下面的Java文档,

便捷类用来读取字符文件。此 类的构造函数假设默认的字符编码和默认字节缓冲器 大小是合适的。要自己指定这些值,请在FileInputStream上构建一个InputStreamReader。

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

  1. 具体传递的file.encoding参数为 “UTF-8”
  2. 用正确的编码构建自己的InputStream。

希望这有助于

+1

要强调的是,如果你在做文本处理时不要使用FileInputStream(除非你有一些需要避免Java的文本处理类)。 –