Java流的误解......有些澄清?

时间:2011-08-11 11:59:17

标签: java stream java-io

我理解字节流处理字节和字符流处理字符...如果我使用字节流来读取字符,这是否限制了我可能阅读的各种字符?例如,字节以8位字节读入,字符以16位字符读入...这是否意味着可以使用字符流而不是字节流来表示更多字符?

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

5 个答案:

答案 0 :(得分:3)

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

  • 将一个字符视为一个字节的ASCII(7位,剩余位未使用)
  • UTF-8:大多数常见字符表示为单个字节,不常见为2或更多

即使在十六进制编辑器中打开文件,这些编码也是可读的。但是,有许多字符编码没有这个功能,即UTF-16和UTF-32。

现在回到你的问题:InputStream只给你一个字节流。如果你的字节代表用ASCII或UTF-8编码的字符,那么大部分时间你都没事。但是如果这些字节代表像UTF-16那样更复杂的东西,那么你绝对需要一个Reader。当然,读者必须知道底层InputStream提供哪种字符编码。这通常是初学者所做的一个问题 - 未明确使用字符编码初始化的Reader通常会回退到系统默认值。

其他方式(与作家)相似。如果您只是将char转换为byte s,那么大部分时间您都可以。但是,如果您的角色包含不太受欢迎的国家字母,您的输出将被格式错误/截断。因此,您创建一个Writer,将每个给定的字符转换为一系列一个或多个字节。您有义务再次提供字符编码。

重要规则:

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

答案 1 :(得分:2)

char是一个16位字符串,表示Unicode字符。

byte是一个8位字符串,表示2的补码数。

这里最重要的是它们都是位串。从技术上讲,char只是2 byte s。除了Java如何对待这两者之外,还有一些细微的语义。就计算机(或Input/OutputStream s)而言,唯一的区别是它们持有的位数。

答案 2 :(得分:1)

我认为您需要掌握字节和字符之间的关系,以便澄清。

这个问题的接受答案非常明确恕我直言:Why does a byte in Java I/O can represent a character?

我还会查看byte stream and character stream

如果你不想让Joel抓住你并让你在潜水艇上剥洋葱6个月,请阅读http://www.joelonsoftware.com/articles/Unicode.html

答案 3 :(得分:0)

java中的所有IO流都只是下面的字节流。 Byte to Character(反之亦然)转换是使用编码完成的。但总而言之,它们都是字节。

答案 4 :(得分:0)

回答你的问题:

  

我理解字节流处理字节和字符流   处理字符...如果我使用字节流来读取字符,   这可能限制了我可能阅读的各种人物吗?

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

  

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

在某种程度上,是的。

  

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

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