2012-09-06 417 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/