我了解到java中的Reader和Writer更适合从文本资源中读取和写入信息,Reader/Writer是基于字符的,而流是基于字节的。 然而,我遇到过一个消息来源说“一些文本是由 ANSI 或 Unicode 编码的。ANSI 需要代码转换,而 Unicode 可以用不同的格式编码,如 UFT-8 或 UFT-16。因此 Reader/Writer 更好”。
这些代码转换和不同格式与文本资源有什么关系吗?因此,Reader 和 Writer 可以做什么使它们在处理文本方面比流更好?
设计 java 时,决定将 text 保存在 java 中作为 Unicode,因此所有脚本,比如希腊语和韩语都可以组合。
Unicode是所有符号(code points)的编号,可以用UTF-8(多字节,一般最紧凑),UTF-16 LE/BE(2字节)甚至UTF-32编码。
所以在内部
String
.class 中的常量是 UTF-8 格式的。 char
类型对于 UTF-16 是 2 个字节。并且 String 包含 char
. 的数组
二进制数据,如
byte[]
或InputStream/OutputStream
可以是文本。但是要将其解释为 text 需要知道这些字节的编码/字符集。因此,总是有字节和这些字节的一些字符集到内部 Unicode (UTF-16) 的转换。
要回答这个问题,以某种方式提供二进制数据的字符集是不可避免的。这是二进制数据的缺陷。
当到达
String, char, Reader, Writer
时,已经完全在Unicode文本上运行了。
桥接类是
InputStreamReader, OutputStreamWriter
和Files
提供了一些不错的实用功能。
将这种情况与 C 进行比较,其中 unsigned char 可能与字节相同(或不相同),而宽字符可能可用也可能不可用。 Java 在这方面比某些语言做得更好。然而,具有 C/C++ 背景的 Java 程序员永远不应该对二进制数据使用
String
或 char[]
:双内存、不可撤销和损坏的转换。相反byte[], ByteArrayOutputStream, ByteBuffer
.