欢迎光临散文网 会员登陆 & 注册

Java中NIO和BIO文件读写的效率和选择问题

2023-08-03 20:03 作者:L-MER  | 我要投稿

今天在面试的时候,面试官问了这样一个问题:


请说一下Java中NIO与BIO的区别,并描述一下如何通过NIO进行一个图片的读写


第一个问题的话,在网络很容易就可以得到答案了,所以在这里就不进行回答了。


侧重放到第二个问题上来,这个问题在当时问到的时候第一时间没有反应过来。因为之所以会问这个问题是在简历上写了Netty相关的技术,在Netty中主要应用的就是NIO实现高效的网络IO。所以对于文件的NIO没有印象了,也没有get到面试官问这个的点是啥。


对于NIO而言,有几个关键的组件:

  1. Channel

  2. ByteBuff

Channel是一个比Stream更加底层的组件。对于操作系统的IO而言,当用户应用程序需要实现IO的时候,一般来说需要操作系统先将磁盘内容写入到系统内存中,然后是由系统内存写入到用户内存,此时这个数据才能由应用程序完全控制。


首先先展示一下BIO和NIO两种不同的文件读写方式:

对这两个方法进行测试查看一下需要的时间(测试的文件大小为700Mb,另外需要注意byte数组以及ByteBuff的大小,大文件传输不要设置的太小了)

  1. NIO :29145ms

  2. BIO :29058ms


可以看到几乎没有差距,其实这个是完全意料之中的。因为NIO的优势不在于传输效率,而是能够利用IO过程中一些等待的时间。在文件传输的时候,在读写过程中,线程是基本一直在工作的。


也就是说:FileChannel是完全工作在阻塞模式下的


至于如何实现更高效的传输,需要用到channel的一个transfer方法

这个方法测试下来的一个时间为:21531ms,可以看到效率还是由比较明显的提升的,这个主要还是归功于类似于0拷贝的思想(关于0拷贝的内容网上同样可以找到大量资料,此处也不做描述了)。如果要做文件的传输的话肯定是选择这个方法更好,但是之前确实没有见到过相关的内容,所以这个面试回答也没有答上来了。


这篇文章主要还是回忆回忆NIO的东西,毕竟感觉在文件读写上这方面的还是运用的比较少,然后顺便测试一下做个记录。


下次再见喽0v0


Java中NIO和BIO文件读写的效率和选择问题的评论 (共 条)

分享到微博请遵守国家法律