Heim >Java >javaLernprogramm >Wie konvertiere ich einen OutputStream in einen InputStream in Java?

Wie konvertiere ich einen OutputStream in einen InputStream in Java?

Linda Hamilton
Linda HamiltonOriginal
2024-11-09 04:11:02202Durchsuche

How to Convert an OutputStream to an InputStream in Java?

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:

  • Parallelität: Die Datenübertragung erfolgt in einem separaten Thread, was eine parallele Verarbeitung ermöglicht.
  • Speichereffizienz: Durch Pipeline-Streams wird die Erstellung zusätzlicher Pufferkopien vermieden, wodurch der Speicherverbrauch reduziert wird.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn