Comment .array () ne fonctionne-t-il pas avec les ByteBuffers renvoyés par FileChannels?

StackOverflow https://stackoverflow.com/questions/1054020

  •  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?

Était-ce utile?

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 seule
  •   
  • hasArray - 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top