2017-10-19 13 views
0

J'essaie d'écrire le contenu d'un tampon d'octets dans un fichier en utilisant le décalage (position). Il fonctionne quand je convertir en un flux d'entrée, mais pas quand je l'envelopper dans une nouvelle ByteBufferHabillage d'un fichier java.nio.ByteBuffer dans une nouvelle instance, avec décalage, perte d'octets

Cela fonctionne:

new ByteArrayInputStream(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

Cela ne

ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

Plus précisément, quand je dis il ne fonctionne pas, écrit le contenu du tampon dans un fichier:

Files.write(path, ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()).array())

résultats en octets écrits dans le fichier, mais il est incomplet, de sorte que le jpeg ne peuvent pas être vus, mais si j'écris le même tampon, envelopper dans un ByteArrayInputStream, il ne fonctionne pas:

val in = new ByteArrayInputStream(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 
Iterator.continually (in.read).takeWhile (-1 != _).foreach (fileOutputStream.write) 

donc je dois être faire quelque chose de stupide et peut-être je ne comprends pas comment fonctionne ByteBuffer

Répondre

1

ByteBuffer.wrap(byteBuffer.array(), <ANYTHING>, <ANYTHING>).array() signifie simplement byteBuffer.array(), et <ANYTHING> n'est pas pris en compte.

En outre, l'ensemble

ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

est juste une façon lourde de créer une copie superficielle de byteBuffer, pourquoi faites-vous au lieu d'utiliser lui-même byteBuffer?

On dirait que ce que vous voulez est quelque chose comme

try (FileChannel outCh = new FileOutputStream(filename).getChannel()) { 
    outCh.write(byteBuffer); 
} 
+0

Vos travaux de suggestion, mais je suis toujours curieux de savoir comment faire fonctionner avec quelque chose comme Files.write, qui prend un tableau d'octets. Certains API avec lesquels je travaille ne prennent qu'un tableau d'octets – Andrew

+0

Vous devez copier manuellement la partie correcte du tableau, voir par ex. ici https://stackoverflow.com/a/679325/2369544. Aussi, une suggestion qui en quelque sorte contredit la philosophie derrière le ByteBuffer et vous ne devriez le faire qu'en dernier recours: https://stackoverflow.com/a/679335/2369544. – starikoff