例外スタックは
_Java.nio.BufferOverflowException
at Java.nio.DirectByteBuffer.put(DirectByteBuffer.Java:327)
at Java.nio.ByteBuffer.put(ByteBuffer.Java:813)
mappedByteBuffer.put(bytes);
_
コード:
_randomAccessFile = new RandomAccessFile(file, "rw");
fileChannel = randomAccessFile.getChannel();
mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, file.length());
_
mappedByteBuffer.put(bytes);
を呼び出します
原因は何ですかmappedByteBuffer.put(bytes)
throws BufferOverflowException
原因を見つける方法
このメソッドによって返されるマップされたバイトバッファーの位置はゼロで、サイズの制限と容量があります。
つまり、bytes.length > file.length()
の場合、BufferOverflowException
を受け取る必要があります。
ポイントを証明するために、私はこのコードをテストしました:
File f = new File("test.txt");
try (RandomAccessFile raf = new RandomAccessFile(f, "rw")) {
FileChannel ch = raf.getChannel();
MappedByteBuffer buf = ch.map(MapMode.READ_WRITE, 0, f.length());
final byte[] src = new byte[10];
System.out.println(src.length > f.length());
buf.put(src);
}
true
が出力される場合にのみ、この例外がスローされます:
Exception in thread "main" Java.nio.BufferOverflowException
at Java.nio.DirectByteBuffer.put(DirectByteBuffer.Java:357)
at Java.nio.ByteBuffer.put(ByteBuffer.Java:832)