敖胤

绳锯木断,水滴石穿;聚沙成塔,集腋成裘。

导航

Java NIO之直接缓冲区简要

在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();
}

posted on 2021-01-15 15:55  敖胤  阅读(117)  评论(0编辑  收藏  举报