Подтвердить что ты не робот

В чем причина исключения 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) вызывает BufferOverflowException
Как найти причину?

4b9b3361

Ответ 1

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)

Ответ 2

Предположительно, потому что ваш массив байтов больше, чем буфер.

put (byte [] bytes)

Я бы попробовал проверить файл file.length() и убедиться, что ваш буфер памяти действительно может быть записан.