同じ入力ストリームを 2 回読み取るにはどうすればよいですか? 何らかの方法でコピーすることは可能ですか?
Web から画像を取得し、それをローカルに保存して、保存した画像を返す必要があります。ダウンロードしたコンテンツへの新しいストリームを開始して再度読み取るよりも、同じストリームを使用する方が速いと思いました。
ベストアンサー1
使用できますorg.apache.commons.io.IOUtils.copy
InputStream の内容をバイト配列にコピーし、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 から画像をダウンロードすることについてのものだったので、画像のバイト数はメモリに「保存」できるほど少ないと想定しました。ここで示した方法は、大規模なストリームには適さない可能性があり、無限のストリームには適さないことは確かです。そのような場合、ここで示した方法は完了する前にメモリ不足になります。)