为什么是人物流?

wul*_*pro 0 java iostream java-io

我理解Java字符流包装字节流,以便根据系统默认值或其他特定定义的字符集来解释基础字节流.

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

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

所以,我的问题是;

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

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

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

Jon*_*eet 6

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

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

因此,(比方说)计算输入源中文本行的方法应该采用Reader参数.如果要计算两个文件中的文本行,其中一个文件以UTF-8编码,其中一个以UTF-16编码,则为每个文件创建一个InputStreamReadera左右FileInputStream,每次指定适当的编码.

(就个人而言,我会FileReader完全避免- 事实上它不允许你指定编码使它无用的IMO.)

  • +1提到`FileReader`是如此该死的无用.:) (2认同)
  • @WulfgarPro:它没有.它读取原始字节.如果将这些原始字节发送到System.out,System.out(它是一个PrintStream)将使用默认平台编码将它们输出到控制台. (2认同)