netty零拷贝——《Netty权威指南》22.2.6
文件IO操作分类
1、普通IO
2、Filechannel
3、MapperByteBuffer
4、DirectByteBuffer
https://zhuanlan.zhihu.com/p/35277219——什么是pageCache
http://www.jiangxinlingdu.com/thought/2018/11/28/io.html——文件读写IO分类
FileChannle和不同IO读写的区别
FileChannel 存在于 java.nio 包中,属于 NIO 的一种,但是注意 NIO 并不一定意味着非阻塞,这里的 FileChannel 就是阻塞的。那么这种新IO较与传统的IO有哪些优势呢?
其实这么说不够严谨,因为你必须用对了FileChannle,不然不存在优势之说。如何用对,就需要先从FileChannle的特点入手,FileChannel 采用了 ByteBuffer 这样的内存缓冲区,让我们可以非常精准的控制写盘的大小,这是普通 IO 无法实现的。
简单来说,传统的IO写数据时,先是往pagecache写入数据,不会马上刷到磁盘,而是将 pagecache 对应的位置标记为脏页,然后内核程序会定时将脏页的数据统一刷到磁盘中,但是为了安全起见,如果突然断电了pagecache中的数据就会丢失,所以这个定时的时间还不能太长,但我们希望的是,每次刷盘的尽可能在脏页比较多的情况下,不然对磁盘的写入效率太低。
而 FileChannel 将ByteBuffer 中的数据也不会马上写入到磁盘中,也是先写到pagecache,但是FileChannel 可以控制写盘的大小,它当然会尽可能写满一块数据块,然后再调用 force() 方法,用于通知操作系统进行及时的刷盘