Diese Seite: http://blog.ostermiller.org/convert-java-outputstream-inputstream beschreibt, wie ein InputStream aus OutputStream erstellt wird:
new ByteArrayInputStream(out.toByteArray())
Andere Alternativen sind die Verwendung von PipedStreams und neuen Threads, was umständlich ist.
Ich mag die Idee nicht, viele Megabyte in ein neues Speicherbyte-Array zu kopieren. Gibt es eine Bibliothek, die dies effizienter erledigt?
BEARBEITEN:
Auf Anraten von Laurence Gonsalves habe ich PipedStreams ausprobiert und es stellte sich heraus, dass es nicht so schwer ist, mit ihnen umzugehen. Hier ist der Beispielcode in Clojure:
(defn #^PipedInputStream create-pdf-stream [pdf-info]
(let [in-stream (new PipedInputStream)
out-stream (PipedOutputStream. in-stream)]
(.start (Thread. #(;Here you write into out-stream)))
in-stream))
quelle
new Thread
Ihr Container aus irgendeinem Grund nicht geeignet ist, prüfen Sie, ob Sie einen Thread-Pool verwenden können.Es gibt eine weitere Open Source-Bibliothek namens EasyStream , die sich auf transparente Weise mit Pipes und Threads befasst. Das ist nicht wirklich kompliziert, wenn alles gut geht. Probleme treten auf, wenn (am Beispiel von Laurence Gonsalves)
Wirft eine Ausnahme. In diesem Beispiel wird der Thread einfach abgeschlossen und die Ausnahme geht verloren, während der äußere
InputStream
möglicherweise abgeschnitten wird.Easystream befasst sich mit der Weitergabe von Ausnahmen und anderen bösen Problemen, die ich seit etwa einem Jahr debugge. (Ich bin der Mantainer der Bibliothek: Offensichtlich ist meine Lösung die beste;)) Hier ist ein Beispiel für die Verwendung:
Es gibt auch eine nette Einführung, in der alle anderen Möglichkeiten zum Konvertieren eines OutputStream in einen InputStream erläutert werden. Einen Blick wert.
quelle
Eine einfache Lösung, die das Kopieren des Puffers vermeidet, besteht darin, einen speziellen Zweck zu erstellen
ByteArrayOutputStream
:Schreiben Sie nach Bedarf in den obigen Ausgabestream und rufen Sie dann
toInputStream
auf, um einen Eingabestream über den zugrunde liegenden Puffer zu erhalten. Betrachten Sie den Ausgabestream nach diesem Punkt als geschlossen.quelle
Ich denke, der beste Weg, um InputStream mit einem OutputStream zu verbinden, sind Piped-Streams - verfügbar im Paket java.io wie folgt:
Meiner Meinung nach gibt es zwei Hauptvorteile für diesen Code:
1 - Mit Ausnahme des Puffers wird kein zusätzlicher Speicher verbraucht.
2 - Sie müssen die Datenwarteschlange nicht manuell bearbeiten
quelle
Normalerweise versuche ich zu vermeiden, einen separaten Thread zu erstellen, da die Wahrscheinlichkeit eines Deadlocks, die Schwierigkeit, den Code zu verstehen, und die Probleme beim Umgang mit Ausnahmen zunehmen.
Hier ist meine vorgeschlagene Lösung: ein ProducerInputStream, der durch wiederholte Aufrufe von produzierenChunk () Inhalte in Blöcken erstellt:
quelle