我需要从发送到输出流的所有内容中获取字节数组。但我得到的却是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]?发布于 2012-09-06 20:24:23
您的代码中有几个缺陷。首先,你应该使用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-06 20:17:46
ObjectOutputStream不是OutputStream,如果它做同样的事情,那么拥有它就没有多大意义了。
ObjectOutputStream用于编写对象,它有页眉(可以看到)和页脚(只有关闭流才能看到)。
发布于 2012-09-06 20:23:50
您没有向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/
https://stackoverflow.com/questions/12299889
复制相似问题