2011-02-03 61 views
3

我有一個來自黑匣子的輸入流(比如說B)。從這個流進入的所有消息都是序列化的二進制數據,每個消息都以四個字節的int開頭。它大部分是日誌記錄數據,每天運行24小時。我用readInt()方法讀取這四個字節。現在,偶爾,主線程會退出EOFException,並使程序崩潰。如何在輸入字節流上設置readInt()塊?

經過研究,我發現它發生在readInt()時輸入流中少於四個字節時發生。我的猜測是緩衝區在連續讀取之間的填充速度不夠快。我正在考慮的一些可能的解決方案包括在讀取之前檢查available()(考慮數據量時消耗太多週期),或者在發生異常時重啓(聽起來像編程不佳)。如果只有我可以阻止使用readInt(),我認爲這將是最好的方式。我已經看過readInt()的實現,但它又歸結爲使用read()進行阻塞。

任何人都知道更好的解決方案嗎?

+1

您似乎通過生成文本牆來阻止閱讀流程;-)引入一些段落可能會使其更具可讀性(並有助於獲得答案)。 – 2011-02-03 14:32:27

+0

`readInt()`的方法是什麼? – axtavt 2011-02-03 14:37:51

+0

你讀什麼樣的流? – 2011-02-03 14:49:06

回答

1

任何阻止調用層次結構的調用都是「綁定」的,以使所有的調用都成爲鏈式阻塞,因爲這兩個調用都是同一個執行線程的一部分。 DataInputStreamreadInt方法對基礎輸入流的read方法進行了四次調用,只要數據不可用,就肯定會阻止此方法,因此您對「緩衝區填充不夠快」的恐懼似乎並不是邏輯。

在服務器進程死亡或丟失連接的情況下,我遇到了這種異常,在這種情況下客戶端最終讀取-1並引發異常。你是否在客戶/服務器代碼中吞噬任何異常?你的日誌顯示任何可疑的東西?

1

我相信你正在使用DataInputStream。那個類拋出EOFException,當它包裝的流從read()方法返回-1(實際上阻塞直到輸入數據可用)。

我想,你應該看看爲什麼主流的讀取返回-1首先。

0

基本InputStream接口需要阻塞讀取,你得到的EOFException類時的readInt()遇到流標記的結束,因爲返回不完整的INT將是一個壞主意,它拋出的E被拋出第二Ø f F ile異常。

EOFException被拋出,因爲流的另一端到達其結尾,已關閉或不再連接。你應該檢查黑盒是否終止連接。

由於流是基於網絡的,因此您的套接字可能會設置超時值,如果是這種情況,請嘗試更改套接字的值SOTimeout