2013-12-26 3 views
12

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

+0

Можете ли вы показать декларацию 'bytes'? –

+0

bytes is byte [] bytes – fuyou001

+0

@ fuyou001, а как насчет размера 'bytes'? – tkroman

ответ

6

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) 
+0

Фактически, файл .lenght is getter bytes.length. Длины файла: 128M – fuyou001

+0

OS автоматически сопоставленный файл в память, почему буфер не пуст – fuyou001

0

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

put(byte [] bytes)

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

Смежные вопросы