我正在学习java nio,我正在使用MappedByteBuffer和ExecutorService来异步复制文件。我的问题是MappedByteBuffer.put()抛出java.nio.BufferOverflowException方法。但在我的调试中,我没有复制到我的目标文件上的位置。这是我用来创建文件新副本的代码的一部分:
for (Future<?> f : futures) {
Message message = (Message) f.get();
try (FileChannel fileChannel = (FileChannel) Files
.newByteChannel(pathWrite, EnumSet.of(
StandardOpenOption.READ,
StandardOpenOption.WRITE,
StandardOpenOption.TRUNCATE_EXISTING))) {
MappedByteBuffer mbb = fileChannel.map(
FileChannel.MapMode.READ_WRITE, message.getCod(),
message.getValue());
if (mbb != null) {
System.out.println("start: " + message.getCod()
+ " - end: " + message.getValue());
ByteBuffer encode = Charset.forName(charEncoding)
.encode(message.getCharBuffer());
mbb.put(encode); // here
}
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
,例外是:
java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:363)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:342)
at memo.MultiThreadingMappedByteBufferExample.multiThreadedWayWithExecutorService(MultiThreadingMappedByteBufferExample.java:139)
答案 0 :(得分:1)
您将文件截断为零长度,根据message.getCod()
和message.getValue()
提供的偏移和长度值映射其中的某些未知部分,因为该值不存在,因为该文件的长度为零,然后尝试将消息提供的charBuffer
放入文件中,该文件仍为零长度,位于由message.getCod()
定义的偏移量处,该偏移量不存在,所以你得到BufferOverflowException
。
我建议您不要截断文件,但不清楚为什么这样做会有效。我建议你使用RandomAccessFile
。简单。你不应该在一个应用程序中使用大量的内存映射文件,仅仅为这个小工作使用它是不合适的。