我已经了解到java中的Reader和Writer更适合从文本资源中读取和写入信息,而Reader / Writer是基于字符的,而流是基于字节的。 然而,我遇到一个消息来源说“有些文本是用ANSI或Unicode编码的.ANSI需要代码转换,Unicode可以用不同的格式编码,如UFT-8或UFT-16。因此读者/写入器更好”。
这些代码转换和不同格式是否与文本资源有关?因此,读者和作者能做什么使得他们在处理文本时比流更好?
答案 0 :(得分:0)
当设计java时,决定将java中的 text 保存为Unicode,因此可以合并所有脚本,例如希腊文和韩文。
Unicode是所有符号的编号(代码点),可以通过UTF-8编码(多字节,一般最紧凑),UTF-16 LE / BE(2字节) )甚至是UTF-32。
所以.class中的内部String
常量是UTF-8。对于UTF-16,类型char
是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
。