背景
java nio中文件读写不管是普通文件读写,还是基于mmap实现零拷贝,都离不开FileChannel这个类。
随便打开RocketMQ 源码搜索FileChannel。
就可以看到使用频率。
kafka也是。
所以在java中文件读写FileChannel尤为重用。
java文件读写全流程
这里说的仅仅是FileChannel基于堆内存(HeapByteBuffer)的文件读写。
如果是mmap或者堆外内存,可能有些步骤会省略,相当于有一些优化。
- FileChannel调用read,将HeapByteBuffer拷贝到DirectByteBuffer。
- JVM在native层使用read系统调用进行文件读取, 这里需要进行上下文切换,从用户态进入内核态。