我理解Java字符流包装字节流,以便根据系统默认值或其他特定定义的字符集来解释基础字节流。
我的系统默认字符集是UTF-8。
如果我使用FileReader
读取文本文件,一切看起来都很正常,因为默认的字符集用于解释基础InputStreamReader
的字节。如果我明确定义InputStreamReader
以UTF-16格式读取UTF-8编码的文本文件,那么一切看起来都很奇怪。使用像FileInputStream
这样的字节流并将其输出重定向到System.out,一切看起来都很好。
所以,我的问题是;
为什么使用字符流很有用?
为什么我会使用字符流而不是直接使用字节流?
什么时候定义特定的字符集很有用?
答案 0 :(得分:6)
处理字符串的代码只应在文本方面“思考” - 例如,逐行读取输入源,您不想关心该源的性质。
但是,存储通常是面向字节的 - 因此您需要在源的字节导向视图(由InputStream
封装)和源的面向字符的视图(由{封装)之间创建转换。 {1}})。
因此,(比方说)计算输入源中文本行的方法应该采用Reader
参数。如果要计算两个文件中的文本行,其中一个文件以UTF-8编码,其中一个以UTF-16编码,则在Reader
周围创建一个InputStreamReader
对于每个文件,每次都指定适当的编码。
(就我个人而言,我会完全避免FileInputStream
- 事实上它不允许你指定编码使得它无用的IMO。)
答案 1 :(得分:3)
InputStream
读取字节,而Reader
读取字符。由于字节映射到字符的方式,您需要在创建InputStreamReader
时指定字符集(或编码),默认为平台字符集。
答案 2 :(得分:1)
当您正在阅读/撰写包含可能是>的字符的文本时127,使用char流。当您正在读/写二进制数据时,请使用字节流。
如果你愿意的话,你可以将文本读作二进制文件,但除非你做出很多假设,否则它很少能让你获得更多。