Comment .array () ne fonctionne-t-il pas avec les ByteBuffers renvoyés par FileChannels?
-
20-08-2019 - |
Question
Je fais des E / S mappés en mémoire en Java. La classe FileChannel vous permet de mapper un ByteBuffer sur une partie particulière d'un fichier. Je le fais avec un fichier ouvert en lecture seule.
Le problème que je rencontre est que je reçois une exception lorsque je tente d'appeler la méthode .array () sur le ByteBuffer obtenu. C'est peut-être parce que .array () renvoie un tableau d'octets [] et que je veux vraiment un tableau d'octets finalisé?
Y at-il un moyen de contourner cela?
La solution
Je suppose que cela concerne FileChannel.map
qui permet de mapper un fichier en mémoire accessible par une MappedByteBuffer
.
Dans la documentation de la méthode ReadOnlyBufferException
, si le fichier est mappé en lecture seule, toute tentative de modification du tampon aboutira à un MapMode.READ_ONLY
:
Une région d'un fichier peut être mappée dans mémoire dans l’un des trois modes suivants:
- Lecture seule: Toute tentative de modification le tampon résultant entraînera une
ByteBuffer.array
être jeté. (UnsupportedOperationException
)
En termes d'exceptions levées par le array
, il existe deux types d’exceptions qui sont levées en fonction de la raison du problème:
Lance:
byte[]
- Si ce tampon est sauvegardé par un tableau mais est en lecture seulehasArray
- Si ce tampon n'est pas sauvegardé par un tableau accessible
Bien que l'exception déclenchée ne soit pas mentionnée dans la question, le fichier en lecture seule est peut-être à l'origine du problème <=> à envoyer par la méthode <=>.
Il convient également de mentionner que <=> est une opération facultative:
Renvoie le tableau d'octets qui sauvegarde cette tampon (opération facultative).
Pour être sûr que la méthode <=> retourne un <=> pouvant être utilisé, appelez la méthode <=> comme suggéré dans la documentation de la <=> méthode:
.Appelez le <=> méthode avant invoquant cette méthode pour assurer que ce tampon a un matrice de support accessible.