1

我需要从发送到输出流的所有内容中获取字节数组。但相反,我得到了 4 个字节的垃圾。为什么?

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]?
4

3 回答 3

2

您的代码中有几个缺陷。首先你应该使用writeObject()

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

那么你应该使用对称ObjectInputStream阅读:

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

但是,如果您已经有了byte[],那么使用 Java 序列化将其转换为字节数组(它已经是!)是没有意义的,只需直接写入和读取即可:

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));
于 2012-09-06T12:24:22.673 回答
0

ObjectOutputStream 不是 OutputStream,如果它做了同样的事情,那么拥有它就没有多大意义了。

ObjectOutputStream 用于写入对象,它有一个标题(您可以看到)和页脚(除非您关闭流,否则您看不到)

于 2012-09-06T12:17:45.770 回答
0

您没有在 objectOutputStream 中写入任何内容,而是在 ObjectOutputStream 中写入了一些元信息。出于您的小示例的目的,您可以使用 ByteArrayOutputStream。然后您需要使用 byteArrayOutputStream.flush() 将数据写入流中。

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

完成后不要忘记关闭流!

byteArrayOutputStream.close();

ObjectOutputStreams 用于序列化对象。如果你想序列化对象,你应该使用 ObjectOutputStream#writeObject 和 ObjectInputStream#readObject。

示例:http: //java.sun.com/developer/technicalArticles/Programming/serialization/

于 2012-09-06T12:23:49.883 回答