文章是摘录: 大部分是同一个作者:
Java IO 底层原理 :
https://blog.youkuaiyun.com/xiaoduanayu/article/details/107055472
摘要:
1.普通IO每次都会产生write系统调用
FileOutputStream.write(msg.getBytes());
2.带缓冲区的 BufferedOutputStream 性能提升的法宝就是:每次调用 write() 方法并不会产生实际的 write 系统调用,而是会先将数据存放于 BufferedOutputStream 实例内部的缓冲区中(缓冲区默认大小 8 KB),等缓冲区满、或者手动调用 BufferedOutputStream.flush() 或 close() 方法时,才会真正调用 write 系统调用将缓冲区数据写入 page cache
- 操作系统自己会控制刷盘机制, 但是如果你想手动刷盘:
使用 RandomAccessFile 读写文件时,在 RandomAccessFile.write() 后使用 RandomAccessFile.getFD().sync() 方法手动刷盘
使用 FileChannel 读写文件时,在 FileChannel.write() 后使用 FileChannel.force() 方法手动刷盘
使用 MappedByteBuffer (mmap) 读写文件时,在 MappedByteBuffer.put() 后使用 MappedByteBuffer.force() 方法手动刷盘
此外, 有几篇相关文章:
通过零拷贝实现高效的数据传输
有关Zero-Copy、MMap以及DirectByteBuffer的一切
详述DirectByteBuffer直接内存与回收
RandomAccessFile、FileChannel和MappedByteBuffer
以普通方式去读写文件时,会产生 read/write 系统调用(这两个的目的地是pagecache, 即内存中而不是刷盘),而通过 mmap 方式操作文件时,在文件读写的过程中不会产生 read/write 系统调用。
FileChannel (nio)可读写, 流io仅可读或仅可写