1. ホーム
  2. java

[解決済み] BufferOverflowExceptionの原因は何ですか?

2022-02-12 03:17:36

質問

例外スタックは

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
原因を知るには?

解決方法は?

FileChannel#map :

このメソッドによって返されるマッピングされたバイトバッファは、位置が0、リミットと容量がサイズになります。

つまり、もし 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)