ObjectOutputStream.toByteArray devuelve basura

Necesito obtener la matriz de bytes de todo lo que envío a la secuencia de salida. Pero en cambio obtengo 4 bytes de basura. ¿Por qué?

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.write(new byte[]{1,2,3,4,5,6,7,8,9});
byte[] original = byteArrayOutputStream.toByteArray(); 
System.out.println(Arrays.toString(original)); // why not [1,2,3,4,5,6,7,8,9]?
Respuesta 1

Hay varios defectos en su código. Antes que nada debes usar writeObject():

objectOutputStream.writeObject(new byte[]{1,2,3,4,5,6,7,8,9});

entonces deberías usar simétrico ObjectInputStreampara leer:

final ObjectInputStream objectInputStream = new ObjectInputStream(
        new ByteArrayInputStream(
                byteArrayOutputStream.toByteArray()
        )
);
byte[] original = (byte[]) objectInputStream.readObject();

Sin embargo, si ya tiene un byte[], no tiene sentido usar la serialización de Java para convertirlo en una matriz de bytes (¡lo que ya es!) Simplemente escríbalo y léalo directamente:

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9});
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
    byteArrayOutputStream.toByteArray()
);
final byte[] original = new byte[9];
byteArrayInputStream.read(original);
System.out.println(Arrays.toString(original));
Respuesta: 2

Un ObjectOutputStream no es un OutputStream y si hiciera lo mismo, no tendría mucho sentido tenerlo.

Un ObjectOutputStream se usa para escribir objetos, tiene un encabezado (que puede ver) y un pie de página (que no puede ver a menos que cierre la secuencia)

Respuesta: 3

Hay un código que realmente no entiendo del libro de Algoritmos de Sedgewick, específicamente la parte de Comparadores. Entiendo muy bien cómo funciona todo lo demás, por ejemplo, el algoritmo proporcionado, ...

Problema: debería analizar una cadena de fecha RFC3339. Funciona bien con ISO_ZONED_DATE_TIME: ZonedDateTime.parse ("1985-04-12T23: 20: 50.52Z", ISO_ZONED_DATE_TIME); ZonedDateTime.parse ("1996-12-19T16: 39: 57 -...

Mi objetivo es conectarme a mi servidor Linux usando una aplicación Java y ejecutar un comando Linux. Ya he logrado esto usando la API JSch pero parece que no puedo entender cómo ejecutar más de ...

Tengo un problema de diseño realmente difícil en mi aplicación de swing. En términos generales, tengo una JTable y una JLabel para mostrar. La etiqueta está justo debajo de la mesa. Cuando la altura de estos dos componentes ...