Java中NIO和BIO文件读写的效率和选择问题
请说一下Java中NIO与BIO的区别,并描述一下如何通过NIO进行一个图片的读写
第一个问题的话,在网络很容易就可以得到答案了,所以在这里就不进行回答了。
侧重放到第二个问题上来,这个问题在当时问到的时候第一时间没有反应过来。因为之所以会问这个问题是在简历上写了Netty相关的技术,在Netty中主要应用的就是NIO实现高效的网络IO。所以对于文件的NIO没有印象了,也没有get到面试官问这个的点是啥。
对于NIO而言,有几个关键的组件:
Channel
ByteBuff
Channel是一个比Stream更加底层的组件。对于操作系统的IO而言,当用户应用程序需要实现IO的时候,一般来说需要操作系统先将磁盘内容写入到系统内存中,然后是由系统内存写入到用户内存,此时这个数据才能由应用程序完全控制。
首先先展示一下BIO和NIO两种不同的文件读写方式:
NIO :29145ms
BIO :29058ms
可以看到几乎没有差距,其实这个是完全意料之中的。因为NIO的优势不在于传输效率,而是能够利用IO过程中一些等待的时间。在文件传输的时候,在读写过程中,线程是基本一直在工作的。
也就是说:FileChannel是完全工作在阻塞模式下的
至于如何实现更高效的传输,需要用到channel的一个transfer方法
21531ms,可以看到效率还是由比较明显的提升的,这个主要还是归功于类似于0拷贝的思想(关于0拷贝的内容网上同样可以找到大量资料,此处也不做描述了)。如果要做文件的传输的话肯定是选择这个方法更好,但是之前确实没有见到过相关的内容,所以这个面试回答也没有答上来了。
这篇文章主要还是回忆回忆NIO的东西,毕竟感觉在文件读写上这方面的还是运用的比较少,然后顺便测试一下做个记录。