从一段错误的代码中联系到的
最近刚开始学习 NIO ,网上搜了一个 IBM 的 NIO 学习资料,感觉学习难度不大,因为我自认为自己之前 IO 基础学得还不错。没想到我使用 NIO 编写的第一个程序,就让我感悟颇深。
下面请大家看看我写的这个类:
感觉没什么毛病,自我感觉很良好嘛, ^_^ 很多时候,当我们自己感觉良好的时候,往往事实上是很不良好。
一运行,出现了红得刺眼的异常信息, -_-! :
仔细一分析,发现:
拿到一个字节的 buffer 后,我竟然随意的对其进行 decode ,哎,只能骂自己头脑简单——怎么能随随便便就对一个 ByteBuffer 进行字符的解码呢?原因是: java 中一个汉字是由 2 个字节组成,但是谁能保证我这 buffer 里面都可以成功解码成汉字呢?其中也许有“半个汉字”也说不准哦。于是 decoder 说“半个汉字,你让我怎么解码!!!”(第 33 行的异常 )
通常的解决思路是:每次都去判断一下:Bytebuffer中最后一个字节是否合法;如果不合法,则说明这个字节是双字节汉字的一部分,这样我们解码时就不要包含这个字节,而是把这个字节放进下次解码之前的Bytebuffer中。这样做,系统就不会抛出“无法正确解码”这类的异常了。
现在来看, NIO 真的适合用来显示文件内容?答案是:不适合。其实 NIO 主要是使用在 socket 网络编程领域,它的出现也仅仅为了弥补 IO 在网络编程中的缺憾。不错, NIO 并不是为了取代 IO 而登上历史舞台的。