2010-06-06 8 views
11

Sto avendo un bel problema qui, e penso che sia perché non capisco molto come dovrei usare l'API fornita da Java.come utilizzare ByteArrayOutputStream e DataOutputStream simultaneamente (Java)

devo scrivere una int e byte[] in un byte[]

ho pensato di utilizzare un DataOutputStream per risolvere i dati di scrittura con writeInt(int i) e write(byte[] b), e per poter mettere che in un array di byte, che dovrebbe utilizzare ByteArrayOutputStream metodo 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, I "loose" un metodo. nel primo caso, non riesco ad accedere al metodo toByteArray() e nel secondo non riesco ad accedere al metodo writeInt().

Come devo utilizzare questo corso insieme?

risposta

35

Ti piace questa:

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

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

w.flush(); 

byte[] result = baos.toByteArray(); 

In realtà la tua seconda versione non funzionerà affatto. DataOutputStream richiede un flusso di destinazione effettivo in cui scrivere i dati. Non puoi fare new DataOutputStream(). In realtà non esiste alcun costruttore come questo.

+0

Mi sono sempre chiesto, c'è davvero ho motivo per irrigare un avvolto 'ByteArrayOutputStream'? – Justin

+0

non c'è ma non si conosce mai il comportamento di un wrapper. Potrebbe effettivamente buffering qualcosa, quindi spengo il wrapper per abitudine :). Se si tratta di un involucro pass-thru non dovrebbe ferire. –

+0

puoi dichiarare la variabile byteArray? e cosa effettivamente w.write (byteArray); fare? –

1

Utilizzare il precedente caso - avvolgere DataOutputStream attorno allo ByteArrayOutputStream. Assicurati di aver salvato il riferimento allo ByteArrayOutputStream. Quando hai finito close() o almeno flush() lo DataOutputStream e poi usi il metodo toByteArray dello ByteArrayOutputStream.

1

è possibile utilizzare un approccio di flusso, se si collega l'OutputStream ad un InputStream attraverso un PipedInputStream/PipetOutputStream. Quindi consumerai i dati dall'inputstream.

Comunque se quello che devi fare è semplice e non non richiede un approccio flusso userei un java.nio.ByteBuffer su cui avete

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

Si può fare una variabile da conservare su ByteArrayOutpu tStream e trasferirlo in DataOutputStream.

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

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(); 
+0

Benvenuti in StackOverflow! Per favore considera ** la formattazione ** 'codice' con markdown quindi è più facile da leggere. Maggiori informazioni: http://stackoverflow.com/editing-help – Aloso

+0

grazie e scusa – mantamusica

Problemi correlati