2010-03-06 44 views
26

我的問題是當它試圖讀取的對象的第二時間,它引發異常:StreamCorruptedException:無效類型代碼:AC

java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at Client.run(BaseStaInstance.java:313) 

java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at Client.run(BaseStaInstance.java:313) 

我第一次發送完全相同的對象消息;然而,當我第二次嘗試做同樣的事情時,它會拋出上面的錯誤。我是否需要重新初始化readObject()方法?我甚至打印出下面一行正在接收的消息對象,它和第一個正確的消息對象一樣。

Object buf = myInput.readObject(); 

我假設有一些附加問題,但我真的沒有用於追加。我只是想每次都讀一條新線。 我真的很感謝在修復這個bug方面的一些幫助。謝謝。

==================================

這一行之前,我只需在run()方法中爲套接字創建輸入和輸出對象即可。對象聲明在類的run()方法之外: -

@Override 
public void run() { 
    try { 
     sleep((int) 1 * 8000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     //Creating input and output streams to transfer messages to the server 
     myOutput = new ObjectOutputStream(skt.getOutputStream()); 
     myInput = new ObjectInputStream(skt.getInputStream()); 
     while (true) { 
      buf = myInput.readObject(); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

你是對的;我不關閉對象。我不知道該怎麼做。

+0

我不知道在哪裏關閉對象 – 2010-03-06 16:53:33

+0

NB你應該抓住EOFException類,而不是把它作爲錯誤:不記錄或打印堆棧跟蹤;讓它終止閱讀循環。我不知道爲什麼你捕捉到UnknownHostException,你不能在相應的try塊內拋出它。睡眠()實際上是浪費時間。去掉它。 – EJP 2014-09-08 22:47:32

回答

54

潛在的問題是,您正在使用新的ObjectOutputStream來寫入現有的ObjectInputStream,您已經使用之前的ObjectOutputStream來寫入。這些流具有由各自的構造函數寫入和讀取的標題,因此如果您創建另一個ObjectOutputStream,則將編寫一個新的標題,該標題以 - 開始 - 猜測是什麼? - 0xAC,和現有的ObjectInputStream在這一點上不期待另一個標題,所以它barf。

在@trashgod引用的Java論壇主題中,我應該忽略關於'重新爲每個對象的兩端'部分:這只是浪費。在套接字的生命週期中使用單個OOS和OIS,並且不要在套接字上使用任何其他流。

如果你想忘記你寫什麼,可以使用ObjectOutputStream.reset().

不要使用任何其他流或同一插座上ReadersWriters。對象流API可以處理所有的Java原始數據類型和所有的類。

+1

+1 @rookie:這是正確的答案,並從原始來源! :-) – trashgod 2010-03-07 16:52:51

+0

@EJP evrytime我運行代碼創建了一個新的OOS和OIS。我如何管理? – 2012-07-03 11:19:31

+0

@AkhilKNambiar我不知道你在問我,上面還沒有回答。 – EJP 2012-07-13 17:29:47

-1

同時使用Java 7/8面臨着類似的例外,我解決它通過添加以下VM參數的

-Dsun.lang.ClassLoader.allowArraySyntax=true 
+0

'相似'不一樣。這並不能解決OP發佈的問題。 – EJP 2018-02-07 07:24:43