2016-08-07 17 views
0

Ich versuche, eine ObjectInputStream zu bekommen, die es mir erlauben wird, Daten von ihm zu lesen, und, wenn es nicht vom richtigen Typ ist, setzen Sie die Daten wieder in den Strom (mit mark und reset) für einen anderen Code zu behandeln. Ich habe versucht, die InputStream aus dem Socket (s im folgenden Beispiel) in einer BufferedInputStream abgerufen vor dem Einwickeln in eine ObjectInputStream, wie ich glaubte, die Lösung zu sein, jedoch beim Aufruf ois.markSupported() wird immer noch falsch zurückgegeben. Unten ist dieser Versuch:Wie kann ich einen ObjectInputStream erhalten, der Mark/Reset unterstützt?

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

Jede Hilfe sehr geschätzt!

+0

Wie wird 's.getInputStream()' erstellt? –

+1

Warum machen Sie den 'anderen Code' nicht mit dem gelesenen Objekt und nicht mit dem Eingabestrom? – rodit

+0

@JohnnyV 's' ist vom Typ' Socket' und wird mit einem 'ServerSocket' erstellt und ruft anschließend' s.accept() 'auf, um die Verbindung herzustellen. –

Antwort

2

Ich würde eine höhere Abstraktion oben auf dem Stream erstellen. So etwas wie dieses (Pseudo-Code, nicht finalisiert):

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(); 
    } 
} 

Sie würden verwenden peek() wiederholt das aktuelle Objekt zu bekommen, und wenn es Ihnen passt, rufen Sie next() zum nächsten zu gehen.

Natürlich müssen Sie mit Ausnahmen umgehen, das Ende des Streams, schließen Sie es richtig, etc. Aber Sie sollten die Idee bekommen.

Oder, wenn Sie gerade alles im Speicher lesen kann, dann tun Sie es und eine Warteschlange mit den Objekten aus dem Stream erstellen, übergeben Sie dann die Warteschlange um und verwendet peek() und poll().

+0

Danke, ich dachte, es gäbe bereits einige Implementierungen in der Anzahl der verschiedenen 'InputStream'-Unterklassen, aber ich denke nicht. Vielleicht weiß ich nicht genug, aber ich finde es komisch, dass, da der eigentliche 'InputStream'-Typ, der an den' ObjectInputStream' übergeben wurde, das Markieren und Zurücksetzen unterstützt, dass der 'ObjectInputStream' selbst dies unterstützen würde. Im Wesentlichen könnte der 'BufferedObjectStream' daher die' markSupported() 'Methode des 'InputStream's aufrufen, statt einfach nur' false 'zurück zu geben. Wissen Sie, warum das nicht der Fall ist? –

+1

Ein ObjectInputStream ist ein statusbehafteter Stream, der Verweise auf Objekte, die er bereits gelesen hat, behalten muss, um sie nicht neu zu erstellen, wenn sie von zukünftigen Objekten des Streams referenziert werden. Ich vermute, goind rückwärts ist nicht offensichtlich. –

+0

Ah, das macht sehr viel Sinn, danke. –