重點:
1、0拷貝需要系統支持。
普通內存模型:
java線程內存 --> 操作系統內存 --> 硬盤
直接內存模型:
java --> 操作系統內存 --> 硬盤
兩者對比,少了一步:直接內存直接操作系統內存,少了java線程內存到操作系統內存拷貝的這一步,所以提升了效率。
代碼:
java.nio.channels.FileChannel#transferTo
示例:
channel.transferTo(0,channel.size(),OutputChannel);
內存映射文件:
MappedByteBuffer:將文件映射到內核中(原有方式,必須在jvm中,才能操作),可以直接操作。具體的讀寫仍然由系統負責。
使用示例:
File file = new File("hello.txt"); //用隨機文件讀寫的方式打開文件 RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rw"); //打開對應的通道 FileChannel channel = randomAccessFile.getChannel(); //將文件直接映射到程序,映射模式為讀寫 MappedByteBuffer mappedByteBuffer = channel.map(MapMode.READ_WRITE,0,file.length()); //接下來,就可以直接操作buffer了