Java流错误概念。。。澄清一下?

Java流错误概念。。。澄清一下?,java,stream,java-io,Java,Stream,Java Io,我知道字节流处理字节,字符流处理字符。。。如果我使用字节流来读取字符,这会限制我读取的字符种类吗?例如,字节作为8位字节读入,字符作为16位字符读入。。。这是否意味着可以使用字符流而不是字节流来表示更多字符 我最不清楚的是字节流是如何写入文件进行读取的。如果我从网络套接字接收字节,我会将它们包装在InputStreamReader中进行写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用FileInputStream读取文件,并使用FileOutputStream写出文件,那么当我使用文本

我知道字节流处理字节,字符流处理字符。。。如果我使用字节流来读取字符,这会限制我读取的字符种类吗?例如,字节作为8位字节读入,字符作为16位字符读入。。。这是否意味着可以使用字符流而不是字节流来表示更多字符


我最不清楚的是字节流是如何写入文件进行读取的。如果我从网络套接字接收字节,我会将它们包装在
InputStreamReader
中进行写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用
FileInputStream
读取文件,并使用
FileOutputStream
写出文件,那么当我使用文本编辑器打开该文件时,为什么该文件是可读的?
FileOutputStream
是如何处理字节的?

我认为您需要掌握字节和字符之间的关系才能得到澄清

对这个问题的公认答案非常清楚,IMHO:

我也要退房


如果你不想让Joel抓到你,让你在潜艇里剥洋葱6个月,只要读一下a
char
是一个16位的字符串,它代表一个Unicode字符

字节是表示2的补码的8位字符串

这里重要的是它们都是位字符串。从技术上讲,
char
就是2
byte
s。除了Java如何处理这两个方面的一些次要语义之外,没有更多,也没有更少。就计算机(或输入/输出流)而言,唯一的区别是它们所持有的位数。

这里的关键概念是:每个人类可读字符以某种方式编码为一个或多个字节。有很多字符编码。最受欢迎的是:

  • ASCII(7位,剩余位未使用),将一个字符视为一个字节
  • UTF-8:大多数常用字符表示为一个字节,不太常见的是2个或更多
即使在十六进制编辑器中打开文件,这些编码也是可读的。但是,有许多字符编码不具有此功能,即UTF-16和UTF-32

现在回到您的问题:
InputStream
只提供字节流。如果您的字节表示用ASCII或UTF-8编码的字符,大多数情况下您都可以。但是,如果这些字节代表更复杂的东西,比如UTF-16,那么您绝对需要一个
读取器。当然,读者必须知道底层的
InputStream
提供了哪些字符编码。这是初学者经常遇到的问题-
读取器
未使用字符编码显式初始化,通常会返回到系统默认值

另一种方式(与作家)是类似的。如果您只需将
char
s转换为
byte
s,大多数情况下您都可以。但是,如果您的字符包含不太流行的国家字母,您的输出将格式错误/被截断。因此,您可以创建一个
编写器
,将每个给定字符转换为一个或多个字节的序列。您有义务再次提供字符编码

重要规则:

  • 处理二进制数据(多媒体、ZIP和PDF文件等)时,始终使用
    InputStream
  • 阅读文本(txt、HTML、XML…)时始终使用
    Reader
  • 始终从字节流读取字符时,了解并指定字符编码,始终有意识地选择用于写入数据的字符编码

    • java中的所有IO流下面都是字节流。字节到字符(反之亦然)的转换是使用编码完成的。但在这一切之下,它们都是字节。

      回答您的问题:


      我知道字节流处理字节和字符流 处理角色。。。如果我使用字节流来读取字符, 这能限制我阅读的字符种类吗

      字符不是字节。根据选定的编码方案,字符存储在一个或多个字节中。编码方案删除/扩展了您可以读取的字符种类限制

      例如,字节作为8位字节读入,字符读入 作为16位字符。。。这是否意味着可以使用更多的字符 使用字符流而不是字节流表示

      在某种程度上,是的

      我最不清楚的是字节流是如何写入 用于读取的文件。如果我从网络套接字接收字节,我 将它们包装在InputStreamReader中以便编写,我会这样做 获取字符流提供的字符转换逻辑。 如果我使用FileInputStream读取文件并使用 FileOutputStream,当我用文本打开这个文件时,为什么它是可读的 编辑FileOutputStream如何处理字节


      对于与字符对应的字节/数据,应使用
      OutputStreamWriter
      写入文件,并使用文本编辑器使其可读。您可以在创建时指定编码,流将对您的文本数据执行编码

      “字节流处理字节,字符流处理字符”。这里的官方术语是InputStream/OutputStream表示字节数据,Reader/Writer表示字符。当然,但这并不能真正回答我的问题。显然,InputStream只能读取用一个字节表示的字符。为什么?你可以让它读2个字节,然后把它转换成一个字符。它之所以只读取一个字节而不读取其他任何内容,是因为它不需要这样做。字节是Java直接支持的最小单元,任何其他数据类型都可以重构