0

我了解 Java 字符流包装字节流,以便根据系统默认值或其他特别定义的字符集解释底层字节流。

我的系统默认字符集是 UTF-8。

如果我使用 aFileReader读取文本文件,一切看起来都很正常,因为默认字符集用于解释来自底层InputStreamReader. 如果我明确定义InputStreamReader将 UTF-8 编码的文本文件读取为 UTF-16,那么一切显然看起来很奇怪。使用类似字节流FileInputStream并将其输出重定向到 System.out,一切看起来都很好。

所以,我的问题是;

  • 为什么使用字符流有用?

  • 为什么我要使用字符流而不是直接使用字节流?

  • 什么时候定义一个特定的字符集有用?

4

3 回答 3

6

处理字符串的代码应该只在文本方面“思考” - 例如,逐行读取输入源,您不想关心该源的性质。

但是,存储通常是面向字节的 - 因此您需要在源的面向字节的视图(由 封装InputStream)和源的面向字符的视图(由封装)之间创建转换Reader

因此(例如)计算输入源中文本行数的方法应该采用Reader参数。如果要计算两个文件中的文本行数,其中一个以 UTF-8 编码,另一个以 UTF-16 编码,您将为每个文件创建一个InputStreamReader环绕 a FileInputStream,每次指定适当的编码.

(我个人会完全避免FileReader- 它不允许您指定编码的事实使它无用 IMO。)

于 2011-03-18T11:51:37.413 回答
3

AnInputStream读取字节,而 aReader读取字符。由于字节映射到字符的方式,您需要在创建时指定字符集(或编码)InputStreamReader,默认为平台字符集。

于 2011-03-18T11:49:20.323 回答
1

当您读取/写入包含可能 > 127 字符的文本时,请使用 char 流。当您读取/写入二进制数据时,请使用字节流。

如果您愿意,您可以将文本读取为二进制文件,但除非您做出很多假设,否则它很少能为您带来太多好处。

于 2011-03-18T11:51:28.587 回答