0

I read a file into a MappedByteBuffer:

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

And write it to an OutputStream:

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

However, I can only do this one, presumably because the ByteBuffer "current location" is at the end of the buffer.

So what is the recommended way to handle the fact I wish to have multiple threads use this memory mapped file?

Cheetah
  • 13,785
  • 31
  • 106
  • 190

1 Answers1

1

Use rewind():

Rewinds this buffer. The position is set to zero and the mark is discarded.

Invoke this method before a sequence of channel-write or get operations, assuming that the limit has already been set appropriately.

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

Please note that ByteBuffer is not a thread-safe structure.

You best option is probably to make a copy of the ByteBuffer for each thread so that it can be read concurrently:

// in thread 1
ByteBuffer duplicate = buffer.duplicate();
// ...
// in thread 2
ByteBuffer duplicate = buffer.duplicate();
// ...
Community
  • 1
  • 1
Jean Logeart
  • 52,687
  • 11
  • 83
  • 118