So konvertieren Sie einen OutputStream in einen InputStream
In der Softwareentwicklung kommt es nicht selten vor, dass Sie auf Situationen stoßen, in denen Sie Daten aus einem InputStream konvertieren müssen Stream-Typ zu einem anderen. Ein solches Szenario ist die Konvertierung eines OutputStreams in einen InputStream.
Einführung in Piped Streams
Die Lösung für dieses Problem liegt in der Verwendung der Java-Klassen PipedInputStream und PipedOutputStream. Diese Klassen ermöglichen die Kommunikation zwischen Streams durch die Erstellung einer bidirektionalen Pipe.
PipedInputStream zu OutputStream (nicht umgekehrt)
Lambda-Ausdruck:
PipedInputStream in = new PipedInputStream(); final PipedOutputStream out = new PipedOutputStream(in); // in a background thread, write the given output stream to the PipedOutputStream for consumption new Thread(() -> { originalOutputStream.writeTo(out); }).start();
Hinweis: Es ist wichtig, mit Situationen umzugehen, in denen der OutputStream möglicherweise vorzeitig geschlossen wird, was zu einer ClosedPipeException führt. Um dies zu vermeiden, können Sie die Konstruktoren umkehren:
PipedInputStream in = new PipedInputStream(out); new Thread(() -> { originalOutputStream.writeTo(out); }).start();
Try-With-Resources:
// take the copy of the stream and re-write it to an InputStream PipedInputStream in = new PipedInputStream(); new Thread(new Runnable() { public void run() { // try-with-resources here // putting the try block outside the Thread will cause the PipedOutputStream resource to close before the Runnable finishes try (final PipedOutputStream out = new PipedOutputStream(in)) { // write the original OutputStream to the PipedOutputStream // note that in order for the below method to work, you need to ensure that the data has finished writing to the ByteArrayOutputStream originalByteArrayOutputStream.writeTo(out); } catch (IOException e) { // logging and exception handling should go here } } }).start();
PipedOutputStream to InputStream
Wenn Sie keinen ByteArrayOutputStream haben, können Sie den folgenden Code verwenden:
PipedInputStream in = new PipedInputStream(); final PipedOutputStream out = new PipedOutputStream(in); new Thread(new Runnable() { public void run() { try { // write the original OutputStream to the PipedOutputStream // note that in order for the below method to work, you need to ensure that the data has finished writing to the OutputStream originalOutputStream.writeTo(out); } catch (IOException e) { // logging and exception handling should go here } finally { // close the PipedOutputStream here because we're done writing data // once this thread has completed its run if (out != null) { // close the PipedOutputStream cleanly out.close(); } } } }).start();
Die Verwendung von Piped-Streams bietet mehrere Vorteile, darunter:
Das obige ist der detaillierte Inhalt vonWie konvertiere ich einen OutputStream in einen InputStream in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!