2017-02-14 2 views
1

Voici en fait trois questions sur la façon de travailler avec des fichiers mappés en mémoire. Ce que j'ai fait fonctionne, mais il me manque une réponse faisant autorité.Redimensionner, rincer et fermer ByteBuffer

obtenir mon ByteBuffer aime suit:

raf = new RandomAccessFile(file, isReadonly ? "r" : "rw"); 
channel = raf.getChannel(); 
buffer = channel.map(mode, 0, channel.size()); 

Pour le redimensionnement, ce qui suit semble fonctionner

raf.setLength(newLength); 
channel = raf.getChannel(); 

sans appeler raf.getChannel(), mais est-il vraiment bon?


Selon le Javadoc, appelant force devrait rincer (j'utilise un lecteur local). Je me demande simplement comment il se fait qu'il ne déclare pas IOException et ce qui se passe si elle échoue?


Que dois-je fermer? Le RandomAccessFile, le FileChannel, ou les deux? Dois-je appeler flush ou MappedByteBuffer.force avant?

Répondre

0

Pour le redimensionnement, ce qui suit semble fonctionner

raf.setLength(newLength); 
channel = raf.getChannel(); 

sans appeler raf.getChannel(), mais est-ce vraiment correct?

Oui. Vous n'avez pas besoin de réacquérir la chaîne. Il est toujours valide après setLength(). Selon la Javadoc, l'appel force() doit le vider (j'utilise un lecteur local). Je me demande simplement comment il se fait qu'il ne déclare pas IOException et ce qui se passe si elle échoue? Vous semblez parler ici de MappedByteBuffer.force(). Je ne peux pas expliquer les choix du designer.

Que dois-je fermer? Le RandomAccessFile, le FileChannel, ou les deux?

L'un d'entre eux.

Dois-je appeler flush() ou MappedByteBuffer.force() avant?

Il n'y a pas de flush(). Vous pouvez appeler le force() si vous le souhaitez, sinon les modifications pourraient être retardées.