2009-11-25 178 views
2

目前我使用的ObjecInputStreamSocket閱讀,和一切工作正常使用這個簡單的代碼:取消讀取從InputStream

ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); 
Object response = input.readObject(); 

現在我想以某種方式取消讀取,無需關閉流,以便我以後可以再讀一遍。可能嗎?

編輯:我想取消讀取只是因爲它阻止了程序流。我不需要兩次閱讀相同的信息。我只是想取消它,以便我可以發送另一個請求,然後讀取(另一個)響應。

+1

我得到的印象有解釋基礎上的反應來看你的問題的方法不止一種。 你想取消readObject()[因爲它是阻塞的]並且能夠在以後再次調用它嗎?或者讓其他海報正確地固定它,你只是想找一種方法將流回滾(儘管你仍然需要找到一種方法來打破readObject())。 – PSpeed 2009-11-25 04:49:04

+0

感謝PSpeed,請看我的更新:) – phunehehe 2009-11-25 04:56:21

回答

2

如果你有某種「主」線程的,那麼你應該執行I/O關閉它。有一個專門用於閱讀的線程和一些擴展處理輸入的線程。如果基於事件,則將結果排列到主線程,如果使用共享狀態設計修改模型。

2

看到什麼ObjectInputStream.markSupported()回報。如果返回true,你可以在開始打電話ObjectInputStream.mark(),然後調用ObjectInputStream.reset()倒帶InputStream還給你標記,以便以後可以重新使用它的地方。

+0

那麼,如果返回false,該怎麼辦? 順便說一句我不想兩次讀取相同的數據,我只想取消讀取,以便我可以發送另一個請求,然後讀取另一個響應。 – phunehehe 2009-11-25 04:51:52

+0

@phunehehe:如果它返回false,那麼這個'InputStream'不支持標記/重置,這個策略對你不起作用。無論如何,如果你沒有重讀相同的數據兩次(在原始問題中沒有提到),那麼該策略將不適用。你爲什麼不簡單實例化一個新的ObjectInputStream?對象實例化最近很便宜。 – Asaph 2009-11-25 04:54:12

+0

但程序塊時,我撥打另一個電話爲'輸入=新的ObjectInputStream(socket.getInputStream());'我想它一定是與舊流(其實我覺得他們是來自同一個插座相同的流)中的問題。我必須創建另一個套接字嗎? – phunehehe 2009-11-25 05:05:19

1

可以使用PushBackInputStream做到這一點。讀取一些字節後,您可以讀取字節。

+0

謝謝,請參閱我的編輯 – phunehehe 2009-11-25 05:07:12