2010-05-28 79 views
0

所以我試圖寫出一個對象到一個ByteArray,但由於某種原因,它不寫任何東西,我看到的事實是返回值爲0,讀它會導致一個例外。OutputStream與ByteArrayOutputStream不寫

BAoutput = new ByteArrayOutputStream(); 
Oout = new ObjectOutputStream(BAoutput); 
Oout.writeObject(receiver); 

其中receiver是我通過參數獲得的對象。 的例外始終是相同的:

java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 

任何想法?

大部分代碼:(有一對夫婦在它上面的定義,沒有什麼有趣的真)

try { 
     BAoutput = new ByteArrayOutputStream(); 
     Oout = new ObjectOutputStream(BAoutput); 
     BAinput = new ByteArrayInputStream(BAoutput.toByteArray()); 
     Oin = new ObjectInputStream(BAinput); 

     Oout.writeObject(receiver); 
     retval = method.invoke(receiver, args); 
     for (Method curr: postMethods){ 
      curr.setAccessible(true); 
      if (curr.invoke(receiver).equals(false)){ 
       receiver = Oin.readObject(); 
       throw new PostconditionFailure(); 
      } 
     }   
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      Oin.close(); 
      Oout.close(); 
      BAinput.close(); 
      BAoutput.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

您是否刷新/關閉輸出流? – Synesso 2010-05-28 06:27:23

+0

拋出的實際異常是什麼? – 2010-05-28 06:28:10

+0

請添加例外的第一行(例外類型和消息) – 2010-05-28 06:28:37

回答

0

這對我來說沒有多大意義。

所以我想寫出一個對象爲ByteArray,但由於某些原因,它沒有書面方式什麼,這是我的事實,返回值是0

什麼是返回看0? writeObject方法根本不返回任何值 - 它的void方法!

...而且由於閱讀它會導致異常。

這並不一定意味着寫入失敗。

我想我們需要看>>>所有< < < <與讀和寫有關的代碼,包括類型聲明和任何封閉的try/catch塊。

編輯

現在我看到完整的代碼,很顯然,真正的問題是什麼:

.... 
    BAoutput = new ByteArrayOutputStream(); 
    Oout = new ObjectOutputStream(BAoutput); 
    BAinput = new ByteArrayInputStream(BAoutput.toByteArray()); 
    Oin = new ObjectInputStream(BAinput); 
    ... 

ByteArrayOutputStream.toByteArray()方法返回一個複製的當前內容的流。由於還沒有寫入流,所以字節數組自然是空的。

的解決問題的方法是提取字節數組,並構建ByteArrayInputStream後,你已經完成寫入Oout並刷新或關閉它。

+0

我想我應該更清楚。我的意思是使用Oin.avaliable(),我知道它沒有什麼可讀的。 無論如何,代碼在OP中。 – Yonatan 2010-05-28 07:44:18

1

首先需要檢查的事項:

  • 沖洗/關閉的ObjectOutputStream(如Synesso已經在他的評論中指出)
  • 確保receiver是可序列化的(或原始類型)
+0

我關閉了輸出和輸入流,但可能沒有在正確的時間? 也,我不是那麼確定何時何地應該沖洗。 接收器是可序列化的。 另外,增加了例外。當我ctrl + Ced它時,該行沒有標記。 – Yonatan 2010-05-28 06:53:35

+0

在打開輸入流進行讀取之前,應該關閉輸出流,並且可以在最後一次寫入之後立即刷新輸出流。 – 2010-05-28 07:11:08

相關問題