我知道字节流处理字节,字符流处理字符...如果我使用字节流来读入字符,这会限制我可以读取的字符类型吗?例如,字节被读取为8位字节,字符被读取为16位字符...这是否意味着可以使用字符流而不是字节流来表示更多的字符?
我感到困惑的最后一件事是字节流是如何写出文件进行读取的。如果我从网络套接字接收字节,我会将它们包装在InputStreamReader中以供写入,这样我就可以获得字符流提供的字符转换逻辑。如果我使用FileInputStream读取文件并使用FileOutputStream写出,为什么当我使用文本编辑器打开该文件时,该文件是可读的?FileOutputStream是如何处理字节的?
发布于 2011-08-11 20:15:00
这里的关键概念是character encoding:以某种方式将每个人类可读的字符编码成一个或多个字节。有大量的字符编码。最受欢迎的是:
将一个字符视为一个字节的
即使在十六进制编辑器中打开文件,这些编码也是可读的。但是,有许多字符编码没有此功能,即UTF-16和UTF-32。
现在回到你的问题:InputStream只给你一个字节流。如果您的字节表示用ASCII或UTF-8编码的字符,那么在大多数情况下就可以了。但是,如果这些字节表示更复杂的内容,比如UTF-16,那么您绝对需要一个Reader。当然,读者必须知道底层InputStream提供了哪种字符编码。这通常是初学者所做的问题-没有显式使用字符编码初始化的Reader通常会退回到系统默认值。
其他方式(对于编写器)也是类似的。如果您只是将您的char%s转换为byte%s,大多数情况下都会很好。但是,如果您的字符包含不太受欢迎的国家字母,则您的输出将会格式错误/被截断。因此,您创建了一个Writer,它将每个给定字符转换为一系列一个或多个字节。同样,您必须提供字符编码。
重要规则:
Reader,在读取文本时使用Reader(文本、超文本标记语言、XML...)发布于 2011-08-11 20:13:28
char是表示Unicode字符的16位字符串。
byte是代表2的补码数的8位字符串。
这里重要的是,它们都是位串。从技术上讲,一个char就是2个byte,没有更多,也没有更少,除了Java对待这两个的方式的一些次要的语义。就计算机(或Input/OutputStream)而言,唯一的区别是它们存储的位数不同。
发布于 2011-08-11 20:09:45
我认为你需要掌握一个字节和一个字符之间的关系才能得到你的澄清。
这个问题的公认答案是非常清楚的IMHO:Why does a byte in Java I/O can represent a character?
我也会去byte stream and character stream看看
如果你不想让乔尔抓到你,让你在潜水艇里剥洋葱6个月,那就读http://www.joelonsoftware.com/articles/Unicode.html吧
https://stackoverflow.com/questions/7025439
复制相似问题