Java stream 误解......一些澄清?

标签 java stream java-io

我知道字节流处理字节而字符流处理字符...如果我使用字节流读取字符,这是否会限制我读取的字符种类?例如,字节读入为 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/

相关文章:

java - 独特地发现客户的最佳方法是什么?

java - 使用java反射实例化接口(interface)?

python - 如何从 ZipFile 进行流式传输?如何压缩 "on the fly"?

api - 为什么 Files.exists(…) 和 Files.notExists(…)?

java - 二维数组帮助 - 乘以负数

java - 将文本文件中的数据解析为 HashMap

algorithm - 如何最佳地返回一个短语是否出现在单词流中?

delphi - 如何检查文件是否有备用数据流?

java - FileOutputstream.close() 并不总是将字节写入文件系统?

java - 逐行写入文件