comment utiliser ByteArrayOutputStream et DataOutputStream simultanément (Java)
-
24-10-2019 - |
Question
Je vais avoir un problème tout à fait ici, et je pense qu'il est parce que je ne comprends pas très bien comment je devrais utiliser l'API fournie par Java.
Je dois écrire un int
et un byte[]
dans un byte[]
Je pensais que l'utilisation d'un DataOutputStream
pour résoudre l'écriture de données avec writeInt(int i)
et write(byte[] b)
, et être en mesure de mettre cela dans un tableau d'octets, j'utiliser la méthode de ByteArrayOutputStream
toByteArray().
Je comprends que ces classes utilisent le modèle Wrapper, donc j'avais deux options:
DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());
ou
ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());
mais dans les deux cas, je « lâche » une méthode. dans le premier cas, je ne peux pas accéder à la méthode de toByteArray()
, et dans le second, je ne peux pas accéder à la méthode de writeInt()
.
Comment dois-je utiliser ces classes ensemble?
La solution
Comme ceci:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream w = new DataOutputStream(baos);
w.writeInt(100);
w.write(byteArray);
w.flush();
byte[] result = baos.toByteArray();
En fait, votre deuxième version ne fonctionnera pas du tout. DataOutputStream
nécessite un flux cible réelle pour écrire les données. Vous ne pouvez pas faire new DataOutputStream()
. Il n'y a pas réellement de constructeur comme ça.
Autres conseils
Pouvez-vous faire une variable emprise sur la ByteArrayOutputStream et le transmettre dans le DataOutputStream.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();
Utilisez le premier cas - enveloppe DataOutputStream
autour du ByteArrayOutputStream
. Assurez-vous que vous enregistrez la référence au ByteArrayOutputStream
. Lorsque vous êtes à proximité d'arrivée () ou au moins flush () le DataOutputStream
puis utiliser la méthode toByteArray du ByteArrayOutputStream
.
Vous pouvez utiliser une approche de flux si vous connectez votre outputstream à un flux entrant par un PipedInputStream
/ PipetOutputStream
. Ensuite, vous consommerez les données du flux entrant.
Quoi qu'il en soit, si ce que vous devez faire est simple et ne pas besoin d'une approche de flux j'utiliser un java.nio.ByteBuffer
sur lequel vous avez
-
put(byte[] src)
pour votrebyte[]
-
putInt(int value)
- et
byte[] array()
pour obtenir le contenu
Vous ne pas besoin de plus comme ceci
Example exampleExample = method(example);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();
La classe entière a une méthode pour obtenir la valeur d'octet d'un int.
Integer.byteValue()