Java流错误概念。。。澄清一下?
我知道字节流处理字节,字符流处理字符。。。如果我使用字节流来读取字符,这会限制我读取的字符种类吗?例如,字节作为8位字节读入,字符作为16位字符读入。。。这是否意味着可以使用字符流而不是字节流来表示更多字符Java流错误概念。。。澄清一下?,java,stream,java-io,Java,Stream,Java Io,我知道字节流处理字节,字符流处理字符。。。如果我使用字节流来读取字符,这会限制我读取的字符种类吗?例如,字节作为8位字节读入,字符作为16位字符读入。。。这是否意味着可以使用字符流而不是字节流来表示更多字符 我最不清楚的是字节流是如何写入文件进行读取的。如果我从网络套接字接收字节,我会将它们包装在InputStreamReader中进行写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用FileInputStream读取文件,并使用FileOutputStream写出文件,那么当我使用文本
我最不清楚的是字节流是如何写入文件进行读取的。如果我从网络套接字接收字节,我会将它们包装在
InputStreamReader
中进行写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用FileInputStream
读取文件,并使用FileOutputStream
写出文件,那么当我使用文本编辑器打开该文件时,为什么该文件是可读的?FileOutputStream
是如何处理字节的?我认为您需要掌握字节和字符之间的关系才能得到澄清
对这个问题的公认答案非常清楚,IMHO:
我也要退房
如果你不想让Joel抓到你,让你在潜艇里剥洋葱6个月,只要读一下a
char
是一个16位的字符串,它代表一个Unicode字符
字节是表示2的补码的8位字符串
这里重要的是它们都是位字符串。从技术上讲,char
就是2byte
s。除了Java如何处理这两个方面的一些次要语义之外,没有更多,也没有更少。就计算机(或输入/输出流)而言,唯一的区别是它们所持有的位数。这里的关键概念是:每个人类可读字符以某种方式编码为一个或多个字节。有很多字符编码。最受欢迎的是:
- ASCII(7位,剩余位未使用),将一个字符视为一个字节
- UTF-8:大多数常用字符表示为一个字节,不太常见的是2个或更多
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直接支持的最小单元,任何其他数据类型都可以重构