我理解字节流处理字节和字符流处理字符...如果我使用字节流来读取字符,这是否限制了我可能阅读的各种字符?例如,字节以8位字节读入,字符以16位字符读入...这是否意味着可以使用字符流而不是字节流来表示更多字符?
我最困惑的是字节流如何写出文件进行读取。如果我从网络套接字接收字节,我会将它们包装在InputStreamReader
中进行写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用FileInputStream
从文件中读取并使用FileOutputStream
写出,当我使用文本编辑器打开文件时,为什么该文件可读? FileOutputStream
如何处理字节?
答案 0 :(得分:3)
这里的关键概念是character encoding:每个人类可读的字符以某种方式编码为一个或多个字节。有很多字符编码。最受欢迎的是:
即使在十六进制编辑器中打开文件,这些编码也是可读的。但是,有许多字符编码没有这个功能,即UTF-16和UTF-32。
现在回到你的问题:InputStream
只给你一个字节流。如果你的字节代表用ASCII或UTF-8编码的字符,那么大部分时间你都没事。但是如果这些字节代表像UTF-16那样更复杂的东西,那么你绝对需要一个Reader
。当然,读者必须知道底层InputStream
提供哪种字符编码。这通常是初学者所做的一个问题 - 未明确使用字符编码初始化的Reader
通常会回退到系统默认值。
其他方式(与作家)相似。如果您只是将char
转换为byte
s,那么大部分时间您都可以。但是,如果您的角色包含不太受欢迎的国家字母,您的输出将被格式错误/截断。因此,您创建一个Writer
,将每个给定的字符转换为一系列一个或多个字节。您有义务再次提供字符编码。
重要规则:
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
写入文件,并使用文本编辑器使其可读。您可以在创建时指定编码,流将执行文本数据的编码。