Frage

Ich verwende eine ObjectInputStream readObject rufen in serialisierten Objects lesen. Ich mag diese Methode Block zu müssen, so suche ich so etwas wie Inputstream.available() zu verwenden.

InputStream.available() wird Ihnen sagen, es gibt Bytes verfügbar sind und dass read() nicht blockieren. Gibt es ein Äquivalent Methode für seriailzation, die Ihnen sagen, wenn es Objects verfügbar und readObject nicht blockieren?

War es hilfreich?

Lösung

Nein. Obwohl Sie die ObjectInputStream in einem anderen Thread verwenden könnten und prüfen Sie, ob das ein Objekt zur Verfügung hat. Im allgemeinen Polling ist keine gute Idee, vor allem mit den Armen Garantien von InputStream.available.

Andere Tipps

Der Java Serialisierung-API wurde nicht entwickelt, um eine available() Funktion zu unterstützen. Wenn Sie Ihre eigenen Objekt-Lese- / Schreibfunktionen implementieren, Sie jede Menge Daten aus dem Stream lesen Sie mögen, und es gibt keine Abrechnungsmethode.

So readObject() nicht weiß, wie viele Daten es gelesen wird, so dass er nicht weiß, wie viele Objekte zur Verfügung.

Wie die andere Post vorgeschlagen, die beste Wahl ist das Lesen in einen separaten Thread zu bewegen.

Ich habe eine Idee, dass eine andere Input in die Kette ein durch Hinzufügen können Verfügbarkeitsinformationen lesbar durch den Kunden machen:

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

Der schwierige Punkt ist Wert von N. es groß genug sein sollte, sowohl die Serialisierung Header und Objektdaten zu decken. Wenn diejenigen, sind unterschiedlicher wild, kein Glück.

Die BufferedInputStream funktioniert für mich, und warum nicht nur überprüfen, ob (bis.available ()> 0) anstelle eines N-Wert, das perfekt funktioniert für mich. Ich denke, ObjectInputStream.readObject Blöcke (= wartet, bis), wenn keine Eingabe gelesen werden soll. Also, wenn es überhaupt eine Eingabe im Strom aka if (bis.available ()> 0) ObjectInputStream.readObject nicht blockieren. Beachten Sie, dass ObjectInputStream.readObject ein ClassNotFoundException werfen könnte, und dass is't ein Problem überhaupt zu mir.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top