在Java NIO中,ByteBuffer是一个”特殊“存在,因为相较其他buffer,除了通用的获取buffer的方法 allocate(int capacity) 外,它还提供了一个public static ByteBuffer allocateDirect(int capacity) 的方法来获取ByteBuffer对象。而通过这个方法获取到的ByteBuffer对象,可以“直接”操作本地内存进行读写,这即是直接缓冲区。
直接缓冲区与非直接缓冲区区别
非直接缓冲区通过allocate(int capacity)方法获取,缓冲区建立在JVM的内存中;
直接缓冲区通过allocateDirect(int capacity)或者FileChannel的map(MapMode mode, long position, long size)方法获取,缓冲区建立在物理内存中。读写速度更快。
非直接缓冲区数据传输
需要JVM内存和本地内存之间进行复制。
直接缓冲区数据传输
通过内存映射文件直接在物理内存读写。
Java直接缓冲区UML图
使用示例
try {
FileChannel inChannel = FileChannel.open(Paths.get("demo1.jpg"), StandardOpenOption.READ);
FileChannel outChannel = FileChannel.open(Paths.get("demo2.jpg"), StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE);
MappedByteBuffer inBuffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
MappedByteBuffer outBuffer = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
byte[] dst = new byte[inBuffer.limit()];
inBuffer.get(dst);
outBuffer.put(dst);
inChannel.close();
outChannel.close();
} catch (IOException e) {
e.printStackTrace();
}