我知道字节流处理字节而字符流处理字符...如果我使用字节流读取字符,这是否会限制我读取的字符种类?例如,字节读入为 8 位字节,字符读入为 16 位字符……这是否意味着可以使用字符流而不是字节流来表示更多字符?
让我感到困惑的最后一件事是字节流如何写入文件以供读取。如果我从网络套接字接收字节,我会将它们包装在 InputStreamReader
中进行写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用 FileInputStream
从文件中读取并使用 FileOutputStream
写出,为什么当我使用文本编辑器打开该文件时它是可读的? FileOutputStream
如何处理字节?
最佳答案
这里的关键概念是character encoding :每个人类可读字符都以某种方式编码为一个或多个字节。有很多字符编码。最受欢迎的是:
- 将一个字符视为一个字节的ASCII(7位,剩余位未使用)
- UTF-8:最常见的字符表示为单个字节,较少见的为 2 个甚至更多
即使您在十六进制编辑器中打开文件,这些编码也是可读的。但是有很多字符编码没有这个特性,即UTF-16和UTF-32。
现在回到你的问题:InputStream
只给你一个字节流。如果您的字节表示使用 ASCII 或 UTF-8 编码的字符,那么大多数情况下都没有问题。但是,如果这些字节表示更复杂的内容,如 UTF-16,则您绝对需要一个 Reader
。当然,读者必须知道底层 InputStream
提供了哪种字符编码。这通常是初学者遇到的问题 - Reader
未明确使用字符编码进行初始化,通常会退回到系统默认值。
其他方式(与作家)类似。如果您只是将 char
转换为 byte
,大多数情况下都没有问题。但是,如果您的字符包含不太受欢迎的国家字母,您的输出将格式错误/截断。因此,您创建了一个 Writer
,它将每个给定的字符转换为一系列一个或多个字节。您有义务再次提供字符编码。
重要规则:
- 始终在处理二进制数据(多媒体、ZIP 和 PDF 文件等)时使用
InputStream
- 始终在阅读文本(txt、HTML、XML...)时使用
Reader
- 始终在从字节流中读取字符时了解并指定字符编码,始终有意识地选择用于写入数据的字符编码。
关于Java stream 误解......一些澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025439/