【旃蒙】深度探索-JAVA NIO VS 传统 IO(二)编码解码

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

如果这篇文章对您有些用处,请点赞告诉我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个字节的模板里,再次编码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值