Domanda

Sto avendo un bel problema qui, e penso che sia perché non capisco molto di come dovrei usare le API fornite da Java.

ho bisogno di scrivere un int e byte[] in un byte[]

ho pensato di utilizzare un DataOutputStream per risolvere la scrittura di dati con writeInt(int i) e write(byte[] b), e per poter mettere che in un array di byte, è necessario utilizzare il metodo ByteArrayOutputStream toByteArray().

Capisco che questo classi utilizzano il modello Wrapper, così ho avuto due opzioni:

DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());

o

ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());

, ma in entrambi i casi, io "perdo" un metodo. nel primo caso, non posso accedere al metodo toByteArray(), e nel secondo, non posso accedere al metodo writeInt().

Come si usa questo classi insieme?

È stato utile?

Soluzione

In questo modo:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream w = new DataOutputStream(baos);

w.writeInt(100);
w.write(byteArray);

w.flush();

byte[] result = baos.toByteArray();

In realtà la vostra seconda versione non funziona affatto. DataOutputStream richiede un flusso effettivo bersaglio in cui scrivere i dati. Non si può fare new DataOutputStream(). Non c'è in realtà alcun costruttore del genere.

Altri suggerimenti

Potresti fare una variabile da tenere in mano il ByteArrayOutputStream e passarlo nel DataOutputStream.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();

Usa il primo caso - DataOutputStream avvolgono la ByteArrayOutputStream. Basta fare in modo di salvare il riferimento alla ByteArrayOutputStream. Quando si è vicini finitura () o almeno a filo () il DataOutputStream e quindi utilizzare il metodo toByteArray del ByteArrayOutputStream.

Si potrebbe utilizzare un approccio flusso se si collega l'OutputStream ad un InputStream attraverso un PipedInputStream / PipetOutputStream. Poi si consumano i dati dal InputStream.

In ogni caso, se ciò che devi fare è semplice e non non richiede un approccio flusso I userebbe un java.nio.ByteBuffer su cui avete

  • put(byte[] src) per il vostro byte[]
  • putInt(int value)
  • e byte[] array() per ottenere il contenuto

Non è necessaria più simile a questo

Example exampleExample = method(example); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();

La classe Integer ha un metodo per ottenere il valore di byte di un int. Integer.byteValue()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top