Input-und Output-Stream-Leitung in Java
Hat jemand irgendwelche gute Vorschläge für das erstellen einer Pipe-Objekt in Java, die ist sowohl ein InputStream und und Ausgabestrom, da Java keine Mehrfachvererbung, und beide streams sind abstrakte Klassen anstelle von Schnittstellen?
Das zugrunde liegende Bedürfnis ist ein einzelnes Objekt, das übergeben werden kann, um die Dinge, die müssen entweder einen InputStream oder eine Ausgabestrom pipe Ausgabe von einem thread auf einen input für einen anderen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es den Punkt in dieser Frage wird ausgelassen. Wenn ich Sie richtig verstehe, möchten Sie ein Objekt, das Funktionen wie einen InputStream in einen thread, und ein Ausgabestrom in eine andere zu einem Mittel der Kommunikation zwischen den beiden threads.
Vielleicht eine Antwort darauf ist, nutzen Komposition anstelle von Vererbung (die ist empfohlene Praxis sowieso). Erstellen Sie ein Rohr, welches einen PipedInputStream und PipedOutputStream miteinander verbunden, mit getInputStream() und getOutputStream() Methoden.
Können Sie nicht direkt durch die Röhre-Objekt zu etwas benötigen einen stream, aber Sie können übergeben der Rückgabewert der get-Methoden, es zu tun.
Funktioniert das für Sie?
java.io.PipedOutputStream und java.io.PipedInputStream suchen, um die Klassen zu verwenden, die für dieses Szenario. Sie sind entworfen, um zusammen verwendet werden zum weiterleiten von Daten zwischen threads.
Wenn Sie wirklich wollen, einige einzelne Objekt zu übergeben, um es brauchen würde, um enthalten je eins von diesen und setzen Sie diese über Getter.
Dies ist eine ziemlich gemeinsame Sache zu tun, denke ich. Finden Sie diese Frage stellen.
Einfach Weg zu schreiben, den Inhalt eines Java-InputStream zu einem Ausgabestrom
Können Sie nicht erstellen Sie eine Klasse, die sich sowohl aus
InputStream
undOutputStream
denn diese sind nicht Schnittstellen, und Sie haben gemeinsame Methoden und Java erlaubt keine Mehrfachvererbung (der compiler nicht wissen, ob callInputStream.close()
oderOutputStream.close()
wenn Sie anrufenclose()
auf Ihrem neuen Objekt).Das andere problem ist der Puffer. Java will, weisen Sie eine statische Puffer für die Daten (die ändert sich nicht). Dies bedeutet, wenn Sie die `java.io.PipedXxxStream', die das schreiben von Daten auf es wird schließlich blockieren, es sei denn, Sie verwenden zwei verschiedene threads.
Also die Antwort von Apocalisp ist richtig: Sie schreiben muss eine Kopie Schleife.
Schlage ich vor, dass Sie die Apache-commons-io in Ihr Projekt enthält viele hilfsroutinen, die nur für Aufgaben wie diese (kopieren von Daten zwischen streams, Dateien, Zeichenfolgen und alle Kombinationen davon).
Sehen http://ostermiller.org/utils/CircularBuffer.html
Musste ich einen filter implementieren, der bei langsamen verbindungen zu Servlets also im Grunde wickelte ich die servlet-Ausgabestream in eine QueueOutputStream die jedes byte (in kleine Puffer), in eine Warteschlange, und dann Ausgang dieser kleine Puffer in einer 2. Ausgabe-stream, so in einer Weise, die diese Handlungen als input/output-stream, IMHO ist es sogar besser als JDK-Leitungen, die nicht skalieren, gut, im Grunde gibt es zu viel Kontext-Umschaltung in der standard-JDK-Implementierung (pro Lesen/schreiben), eine blockierende Warteschlange ist einfach perfekt für einen single-producer/consumer Szenario: