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 サイトの他の関連記事を参照してください。