重用MemoryMappedByteBuffer

重用MemoryMappedByteBuffer

我将文件读入MappedByteBuffer

MappedByteBuffer buffer = FileChannel.open(file, StandardOpenOption.READ)
    .map(FileChannel.MapMode.READ_ONLY, 0, Files.size(file))
    .load();


并将其写入OutputStream

Channels.newChannel(getOutputStream())
    .write(buffer);


但是,我只能这样做,大概是因为ByteBuffer“当前位置”在缓冲区的末尾。

那么,建议使用哪种方法来处理我希望有多个线程使用此内存映射文件的事实?

最佳答案

使用rewind()


倒带此缓冲区。位置设置为零,标记被丢弃。

假设已经适当设置了限制,请在执行一系列通道写入或get操作之前调用此方法。


Channels.newChannel(getOutputStream()).write(buffer);
buffer.rewind();
// ...
Channels.newChannel(getOutputStream()).write(buffer);
buffer.rewind();
// ...


请注意,ByteBuffer不是线程安全的结构。

最好的选择可能是为每个线程制作ByteBuffer的副本,以便可以同时读取它:

// in thread 1
ByteBuffer duplicate = buffer.duplicate();
// ...
// in thread 2
ByteBuffer duplicate = buffer.duplicate();
// ...

关于java - 重用MemoryMappedByteBuffer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33040045/

10-10 22:21