重用MemoryMappedByteBuffer

时间:2015-10-09 13:51:49

标签: java nio memory-mapped-files nio2

我将文件读入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“当前位置”位于缓冲区的末尾。

那么处理我希望让多个线程使用这个内存映射文件的事实的推荐方法是什么?

1 个答案:

答案 0 :(得分:1)

使用rewind()

  

回复此缓冲区。该位置设置为零,标记将被丢弃。

     

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

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();
// ...