如果这篇文章对您有些用处,请点赞告诉我O(∩_∩)O
接上篇,继续研究第(2)个问题:
(1)传统IO中也有BufferInputStream,BufferReader,和NIO中的Buffer相比有什么不同?
(2)传统IO中的Reader,Writer也能实现编码解码,和NIO中的Charset相比有什么不同?
(3)传统IO对流read,writer,NIO对通道read,writer有什么不同?是否支持一些新的IO操作?
(4)传统IO里面没有Selector这个特性,看不懂,它能带来什么好处?
一、基本概念
要弄懂Charset,就必须了解编码解码含义。
假设将一段文字写入文件,然后在从文件中读出来。
这样一个简单的场景,计算机如何操作呢?
问题1:如何将文字转换为0,1的数字?
首先大家都知道计算机只认识0,1,无法理解字符,也就无法理解汉字。如何将文字转换为数字呢?
人们想到要给世界上所有的字符都指定唯一的一个数字与其对应。这个数字称为码点,范围是0-0x10FFFF,整套数字称为统一码UNICODE。
下图是汉字在UNICODE范围,网上也有使用4E00~9FA5判断是否为汉字,其实不是非常准确。(0,1的二进制太长,我们更喜欢用十六进制表示)

(此图来自qqxiuzi)
如:

问题2:如何“断字”?
解决了字符对应数字的问题后,如果按照UNICODE码点直接存入文件,有可能是2个字节也有可能是3个,当我们从文件中读出一个字节,如何分辨属于前者还是后者。如:“李𠗃” 使用UNICODE码点存入文件后为674E205C3,只有读出正确的码点,才能对照出正确字符,那么此时几个字节对应一个字符呢?分辨不出。
于是人们想到给码点规定统一的长度,即统一4个字节表示一个UNICODE码点(不够补0),写入和读出时按照统一规则“断字”。这种二次编码(UNICODE编码的编码)称为UCS-4,范围为 U+00000000~U+7FFFFFFF。“李𠗃” 使用UCS-4编码后为0000674E 00205C3,读出时4个字节一读就可以得到正确的码点。
问题3:如何避免空间浪费?
使用定长编码解决了“断字”的问题。但UNICODE码点是2~3个字节,现在都使用4个字节二次编码,这样文字越多,存储空间浪费越多。接着人们想到了动态长度编码,即将UNICODE码点,按照不同范围,放到1~4个字节的模板里,再次编码。

本文探讨了传统IO中的BufferInputStream和BufferedReader与NIO中Buffer的差异,以及Reader/Writer和Charset在编码解码上的不同。重点讲解了字符编码(如UTF-8、UTF-16)在IO操作中的处理方式,以及它们在处理不完整字符和空间效率上的优劣。
最低0.47元/天 解锁文章
1079






