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?
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)
Soi-disant parce que votre tableau d'octets est plus grand que le tampon.
J'irais en vérifiant votre file.length () et m'assurer que votre mémoire tampon peut réellement être écrite.