2012-09-06 190 views
0

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

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

回答

1

有在你的代码的几个缺陷。首先,你应该使用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)); 
+0

谢谢。你介意看我的另一个问题吗? http://stackoverflow.com/questions/12302838/writing-to-the-objectoutputstream-and-getting-rubbish-back – user1651914

0

ObjectOutputStream不是一个OutputStream,如果它做了同样的事情,那就没有多少意义了。

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

+0

好的。但是对于序列化,我需要实现 public void writeObject(ObjectOutputStream out)抛出IOException,那么如何才能将一个序列化的输出转换为字节数组呢? – user1651914

+0

最简单的方法是将'byte []'写为Tomasz演示的对象。这将使用比您预期更多的字节,但是您的数据将在那里,并且您可以使用ObjectInputStream将其读出;) –

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/