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?

Était-ce utile?

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 votre byte[]
  • 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()

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