2009-10-01 20 views
5

我正在使用ObjectInputStream來調用readObject以讀取序列化的Objects。我想避免這種方法阻止,所以我正在尋找使用像Inputstream.available()Java序列化ObjectInputStream.readObject(),檢查是否會阻塞

InputStream.available()會告訴你有可用的字節和read()不會阻塞。是否有相當的方法進行seriailzation,會告訴你是否有Object s可用和readObject不會阻止?

回答

6

不可以。儘管您可以在另一個線程中使用ObjectInputStream並檢查是否有可用的對象。一般來說,投票並不是一個好主意,特別是在InputStream.available的可靠保證下。

4

Java序列化API的設計不支持available()函數。如果您實現自己的對象讀取器/寫入器功能,則可以從您喜歡的流中讀取任意數量的數據,並且不存在報告方法。

所以readObject()不知道它將讀取多少數據,所以它不知道有多少對象可用。

正如另一篇文章所建議的,你最好的選擇是把閱讀轉移到一個單獨的線程中。

0

我有一個想法,通過增加其他的InputStream成鏈中的一個可以使讀取的客戶端可用性的信息:

HACK!

InputStream is = ... // where we actually read the data 
BufferedInputStream bis = new BufferedInputStream(is); 
ObjectInputStream ois = new ObjectInputStream(bis); 

if(bis.available() > N) { 
    Object o = ois.readObject(); 
} 

棘手的點爲N.應該足夠大,以覆蓋兩個序列報頭和對象數據的值。如果這些變化很大,就沒有運氣。

+1

如果他們完全不同,那麼你可能會失去大。如果您選擇的N大於下一個對象,那麼您可能會陷入死鎖狀態,在此狀態下您等待的不僅僅是當前對象,而且發件人也不會發送下一個對象,直到您響應前一個對象。在使用這種方法之前,最好確保有無數的投入供應! – PanCrit 2009-11-28 13:56:01

0

BufferedInputStream適用於我,爲什麼不只是檢查是否(bis.available()> 0)而不是N值,這對我來說完全適用。 我認爲ObjectInputStream.readObject塊(=等待),當沒有輸入被讀取。因此,如果在流中還有任何輸入,如果(bis.available()> 0)ObjectInputStream.readObject不會阻塞。請記住,ObjectInputStream.readObject可能會拋出ClassNotFoundException,這對我來說根本不是問題。