NIO中,java.nio.charset.MalformedInputException

从一段错误的代码中联系到的

 

最近刚开始学习 NIO ,网上搜了一个 IBM NIO 学习资料,感觉学习难度不大,因为我自认为自己之前 IO 基础学得还不错。没想到我使用 NIO 编写的第一个程序,就让我感悟颇深。

 

下面请大家看看我写的这个类:

 

感觉没什么毛病,自我感觉很良好嘛, ^_^  很多时候,当我们自己感觉良好的时候,往往事实上是很不良好。

一运行,出现了红得刺眼的异常信息, -_-!

 

仔细一分析,发现:

拿到一个字节的 buffer 后,我竟然随意的对其进行 decode ,哎,只能骂自己头脑简单——怎么能随随便便就对一个 ByteBuffer 进行字符的解码呢?原因是: java 中一个汉字是由 2 个字节组成,但是谁能保证我这 buffer 里面都可以成功解码成汉字呢?其中也许有“半个汉字”也说不准哦。于是 decoder 说“半个汉字,你让我怎么解码!!!”(第 33 行的异常

通常的解决思路是:每次都去判断一下:Bytebuffer中最后一个字节是否合法;如果不合法,则说明这个字节是双字节汉字的一部分,这样我们解码时就不要包含这个字节,而是把这个字节放进下次解码之前的Bytebuffer中。这样做,系统就不会抛出“无法正确解码”这类的异常了。

 

现在来看, NIO 真的适合用来显示文件内容?答案是:不适合。其实 NIO 主要是使用在 socket 网络编程领域,它的出现也仅仅为了弥补 IO 在网络编程中的缺憾。不错, NIO 并不是为了取代 IO 而登上历史舞台的。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值