入力ストリームを2回読み取る 質問する

入力ストリームを2回読み取る 質問する

同じ入力ストリームを 2 回読み取るにはどうすればよいですか? 何らかの方法でコピーすることは可能ですか?

Web から画像を取得し、それをローカルに保存して、保存した画像を返す必要があります。ダウンロードしたコンテンツへの新しいストリームを開始して再度読み取るよりも、同じストリームを使用する方が速いと思いました。

ベストアンサー1

使用できますorg.apache.commons.io.IOUtils.copyInputStream の内容をバイト配列にコピーし、ByteArrayInputStream を使用してバイト配列から繰り返し読み取ります。例:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
org.apache.commons.io.IOUtils.copy(in, baos);
byte[] bytes = baos.toByteArray();

// either
while (needToReadAgain) {
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    yourReadMethodHere(bais);
}

// or
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
while (needToReadAgain) {
    bais.reset();
    yourReadMethodHere(bais);
}

警告 06/06/24 - これはストリームをバイト配列にコピーします。質問は Web から画像をダウンロードすることについてのものだったので、画像のバイト数はメモリに「保存」できるほど少ないと想定しました。ここで示した方法は、大規模なストリームには適さない可能性があり、無限のストリームには適さないことは確かです。そのような場合、ここで示した方法は完了する前にメモリ不足になります。

おすすめ記事