JavaでOutputStreamをInputStreamに変換するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-09 04:11:02
オリジナル
162 人が閲覧しました

How to Convert an OutputStream to an InputStream in Java?

OutputStream を InputStream に変換する方法

ソフトウェア開発では、あるストリームからデータを変換する必要がある状況に遭遇することは珍しくありません。ストリームタイプを別のタイプに変更します。そのようなシナリオの 1 つは、OutputStream を InputStream に変換することです。

Piped Streams の概要

この問題の解決策は、Java の PipedInputStream クラスと PipedOutputStream クラスを使用することにあります。これらのクラスは、双方向パイプを作成することでストリーム間の通信を可能にします。

PipedInputStream から OutputStream へ (その逆はありません)

ラムダ式:

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();
ログイン後にコピー

注: OutputStream が途中で閉じられ、ClosedPipeException が発生する可能性がある状況を処理することが重要です。これを回避するには、コンストラクターを反転します:

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

ByteArrayOutputStream がない場合は、次のコードを使用できます:

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();
ログイン後にコピー

パイプされたストリームを使用すると、次のようないくつかの利点があります。

  • 同時実行性: データ転送は別のスレッドで行われ、並列処理が可能になります。
  • メモリ効率: パイプされたストリームにより、追加のバッファ コピーの作成が回避され、メモリ消費が削減されます。

以上がJavaでOutputStreamをInputStreamに変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート