web-dev-qa-db-fra.com

Quelle est la cause de BufferOverflowException?

La pile d'exceptions est 

Java.nio.BufferOverflowException
     at Java.nio.DirectByteBuffer.put(DirectByteBuffer.Java:327)
     at Java.nio.ByteBuffer.put(ByteBuffer.Java:813)
            mappedByteBuffer.put(bytes);

Le code:

randomAccessFile = new RandomAccessFile(file, "rw");
fileChannel = randomAccessFile.getChannel();
mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, file.length());

et appelez mappedByteBuffer.put(bytes);

Quelle est la cause mappedByteBuffer.put(bytes) lève BufferOverflowException
Comment trouver la cause?

16
fuyou001

FileChannel # map :

La mémoire tampon d'octets mappée renvoyée par cette méthode aura une position zéro, une limite et une capacité de taille;

En d'autres termes, si bytes.length > file.length(), vous devriez recevoir un BufferOverflowException.

Pour prouver le point, j'ai testé ce code:

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);
}

Si et seulement sitrue est imprimé, cette exception est levée:

Exception in thread "main" Java.nio.BufferOverflowException
at Java.nio.DirectByteBuffer.put(DirectByteBuffer.Java:357)
at Java.nio.ByteBuffer.put(ByteBuffer.Java:832)
7
Marko Topolnik

Soi-disant parce que votre tableau d'octets est plus grand que le tampon.

put (byte [] bytes)

J'irais en vérifiant votre file.length () et m'assurer que votre mémoire tampon peut réellement être écrite. 

0
XFCC