2016-08-07 28 views
0

我試圖獲得一個ObjectInputStream,它允許我從中讀取數據,如果它不是正確類型,請將數據放回到流中(使用markreset)以供其他代碼處理。我試過在(在下面的例子中爲s)中檢索到的InputStreamBufferedInputStream中打包,然後將其包裝在ObjectInputStream中,因爲我相信是解決方案,但是在調用ois.markSupported()時仍然返回false。以下是該嘗試:如何獲得支持標記/重置的ObjectInputStream?

ois = new ObjectInputStream(new BufferedInputStream(s.getInputStream())); 

任何幫助非常感謝!

+0

s.getInputStream()是如何創建的? –

+1

爲什麼不讓'其他代碼'處理已被讀取的對象而不是輸入流。 – rodit

+0

@JohnnyV's'類型爲'Socket',並使用'ServerSocket'創建,然後調用's.accept()'創建連接。 –

回答

2

我會在流的頂部構建一個更高層次的抽象。事情是這樣的(僞代碼,沒有定型):

public class Buffer { 
    private final ObjectInputStream in; 

    private Object current; 

    public Buffer(ObjectInputStream in) { 
     this.in = in; 
    } 

    public Object peek() { 
     if (current == null) { 
      current = in.readObject(); 
     } 
     return current; 
    } 

    public void next() { 
     current = in.readObject(); 
    } 
} 

你會使用PEEK()多次得到當前對象,如果它適合你,調用next()轉到下一個。

當然,你需要處理異常,流的結束,正確關閉等,但你應該明白。或者,如果您只能讀取內存中的所有內容,請執行此操作,並使用流中的對象創建隊列,然後將該隊列傳遞給隊列,並使用peek()poll()

+0

謝謝,我認爲在不同'InputStream'子類的數目中已經有一些實現了,但我想不是。也許我不夠了解,但是我覺得很奇怪,因爲傳遞給ObjectInputStream的實際'InputStream'類型支持標記和重置,ObjectInputStream本身會支持它。所以基本上'BufferedObjectStream'可以調用它的'InputStream'' markSupported()'方法而不是僅僅返回false,你知道爲什麼不是這種情況嗎? –

+1

ObjectInputStream是一個有狀態的流,它需要保持對它已經讀取的對象的引用,以便在它們被流的將來對象引用時不重新創建它們。我懷疑後退並不明顯。 –

+0

啊,這很有道理,謝謝。 –