J'ai créé un java.nio.MappedByteBuffer
autour d'un java.io.RandomAccessFile
(un fichier de seulement 54 Ko). Le résultat MappedByteBuffer
a une «capacité» et une «limite» d'environ 12 Ko, alors quand j'essaie d'invoquer mybytebuffer.get(i > 13044)
ou mybytebuffer.put(i > 13044, value)
, il lance un InvalidIndexException
.Java.NIO InvalidIndexException - comment lire et écrire avec un accès aléatoire aux fichiers volumineux
Tout ce comportement est documenté dans les javadocs officiels de Sun. Ma question est comment je peux utiliser java.nio ByteBuffers
pour lire ou écrire n'importe où dans le fichier (j'ai besoin d'un accès aléatoire). Je n'arrive pas à trouver un exemple ou une documentation de Java NIO qui illustre l'accès non-séquentiel.
avez-vous essayé d'appeler la limite (la taille réelle)? – bmargulies
Oui, mais je ne peux pas définir limite> capacité. La capacité est une limite dure qui ne peut pas être augmentée. J'espérais que je pourrais cacher le fait qu'un ByteBuffer était enroulé autour d'un fichier pour le code qui l'utilise, mais cela me semble impossible maintenant: il n'y a pas de solutions natives et vous ne pouvez pas étendre ByteBuffer pour faire votre propre abstraction. Laid. –
Pourquoi s'embêter avec un fichier mappé en mémoire pour un fichier de 54 Ko? Le mappage de la mémoire a ses avantages pour les fichiers volumineux. Pour les petits fichiers, il est souvent plus lent car l'initialisation du mappage prend un certain temps. – dmeister