读取输入流两次

2022-08-31 07:29:00

如何读取同一输入流两次?是否可以以某种方式复制它?

我需要从网络获取图像,将其保存在本地,然后返回保存的图像。我只是认为使用相同的流会更快,而不是开始一个新的流到下载的内容,然后再次阅读它。


答案 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);
}

答案 2

根据输入流的来源,您可能无法重置它。您可以使用 检查 是否支持 和 是否受支持。mark()reset()markSupported()

如果是,您可以调用 InputStream 返回到开头。如果没有,则需要再次从源中读取 InputStream。reset()


推荐