コーディングの領域では、データを OutputStream から InputStream にリダイレクトすることが必要になることがよくあります。この複雑な変換は、逆ほど単純ではありませんが、パイプを巧みに利用することで実現できます。
パイプの力を解読する
Java の java.io。 PipedInputStream クラスと java.io.PipedOutputStream クラスが、この変換プロセスの主要なプレーヤーとして登場します。これらは、OutputStream と InputStream の間に一方向のパイプラインを確立し、大幅なメモリ オーバーヘッドを発生させることなくシームレスなデータ転送を可能にします。
Lambda を利用した楽な変換のためのコード
以下コード スニペットはラムダを活用して変換を簡素化します。
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();
Try-with-Resources: エレガントなアプローチ
あるいは、try-with-resources はエレガントな構文を提供します。リソースの管理について:
PipedInputStream in = new PipedInputStream(); new Thread(new Runnable() { public void run () { // try-with-resources here // placing the try block outside the Thread will prematurely close the PipedOutputStream try (final PipedOutputStream out = new PipedOutputStream(in)) { // write the original OutputStream to the PipedOutputStream originalByteArrayOutputStream.writeTo(out); } catch (IOException e) { // logging and exception handling should go here } } }).start();
追加の考慮事項
OutputStream の作成を制御できない場合、ClosedPipeException が発生する可能性があります。これを解決するには、コンストラクターを反転します。
PipedInputStream in = new PipedInputStream(out); new Thread(() -> {originalOutputStream.writeTo(out);}).start();
パイプ変換の利点
この変換方法は、メモリ効率の点で優れています。データの複製コピーを作成する他の手法とは異なり、パイプは追加のメモリを消費せずにストリーム間の接続を確立するだけです。さらに、別のスレッドでの非同期実行により、遅延が最小限に抑えられ、リソース使用量が削減されます。
以上がJavaでパイプを使用してOutputStreamをInputStreamに変換する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。