web-dev-qa-db-ja.com

BufferOverflowExceptionの原因は何ですか?

例外スタックは

_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
原因を見つける方法

19
fuyou001

FileChannel#map

このメソッドによって返されるマップされたバイトバッファーの位置はゼロで、サイズの制限と容量があります。

つまり、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)
8
Marko Topolnik

おそらく、バイト配列がバッファよりも大きいためです。

put(byte [] bytes)

File.length()をチェックして、メモリバッファが実際に書き込まれることを確認します。

0
XFCC