2010-06-06 20 views
11

Estoy teniendo un gran problema aquí, y creo que es porque no entiendo mucho cómo debería usar la API proporcionada por Java.cómo usar ByteArrayOutputStream y DataOutputStream simultáneamente (Java)

tengo que escribir un int y una byte[] en un byte[]

pensé en usar un DataOutputStream para resolver los datos de escritura con writeInt(int i) y write(byte[] b), y ser capaz de poner esto en una matriz de bytes, lo que debería utilizar ByteArrayOutputStream método toByteArray().

que entender que estas clases utilizan el patrón de la envoltura, así que tenía dos opciones:

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

o

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

pero en ambos casos, lo "suelto" un método. en el primer caso, no puedo acceder al método toByteArray(), y en el segundo, no puedo acceder al método writeInt().

¿Cómo debo usar esta clase?

Respuesta

35

De esta manera:

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

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

w.flush(); 

byte[] result = baos.toByteArray(); 

En realidad su segunda versión no funcionará en absoluto. DataOutputStream requiere una secuencia de destino real en la que escribir los datos. No puede hacer new DataOutputStream(). En realidad, no hay ningún constructor así.

+0

Siempre me he preguntado, ¿existe realmente me motivo para eliminar una envuelta 'ByteArrayOutputStream'? – Justin

+0

no existe pero nunca se sabe el comportamiento de un contenedor. En realidad, podría almacenar algo en el buffer así que limpie la envoltura por hábito :). Si se trata de una envoltura directa, no debería doler. –

+0

¿puedes declarar la variable byteArray? y qué es realmente w.write (byteArray); ¿hacer? –

1

Utilice la caja anterior DataOutputStream alrededor del ByteArrayOutputStream. Solo asegúrese de guardar la referencia al ByteArrayOutputStream. Cuando termine, cierre() o al menos enjuague() el DataOutputStream y luego use el método toByteArray del ByteArrayOutputStream.

1

Se puede usar un enfoque de corriente si se conecta el OutputStream a un flujo de entrada a través de un PipedInputStream/PipetOutputStream. Entonces consumirás los datos de inputstream.

De todos modos, si lo que hay que hacer es simple y no no requiere un enfoque corriente me gustaría utilizar un java.nio.ByteBuffer en el que tiene

  • put(byte[] src) para su byte[]
  • putInt(int value)
  • y byte[] array() para obtener el contenido
2

¿Podría hacer una variable para aferrarse al ByteArrayOutpu tStream y pásalo al DataOutputStream.

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

No necesitas de la misma familia

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

¡Bienvenido a stackoverflow! Considere ** formatear ** 'código' con el descuento para que sea más fácil de leer. Más información: http://stackoverflow.com/editing-help – Aloso

+0

gracias y lo siento – mantamusica

Cuestiones relacionadas