2016-08-07 6 views
0

ObjectInputStreamを取得しようとしていますが、正しいタイプでない場合は、データをストリームに戻します(markresetを使用)。私は(以下の例ではs)から取り出したInputStreamBufferedInputStreamにラップする前に解凍を試みましたが、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を使用し、それはあなたに合っている場合、次のいずれかに行くために)(次の呼び出します。この(擬似コード、確定していない)のようなもの。

もちろん、例外、ストリームの終わり、適切な終了などを処理する必要があります。しかし、あなたはその考えを得るべきです。

または、メモリ内のすべてを読み取るだけの場合は、ストリームからオブジェクトを含むキューを作成し、そのキューを渡してpeek()poll()を使用します。

+0

ありがとう、私はいくつかの実装がすでに異なるInputStreamサブクラスの数にあると思っていましたが、そうは思わないでしょう。たぶん私は十分に分かっていないかもしれませんが、 'ObjectInputStream'に渡された実際の' InputStream'型が 'ObjectInputStream'自体がサポートするmarkとresetをサポートしているので、それは不思議です。したがって、本質的に 'BufferedObjectStream'はfalseを返すのではなく、' InputStream'の 'markSupported()'メソッドを呼び出すことができます。なぜそうでないのか知っていますか? –

+1

ObjectInputStreamは、ストリームの将来のオブジェクトによって参照される場合、それらを再作成しないために、すでに読み込んだオブジェクトへの参照を保持する必要があるステートフルストリームです。私は後ろ向きの行為は明らかではないと思う。 –

+0

ああ、それはたくさんの意味がある、ありがとう。 –

関連する問題