保留输入流以进行顺序读取
在某些情况下可能需要多次读取输入流而不修改它或创建新流场景,例如下载图像并将其保存到本地时。幸运的是,可以复制输入流以进行重复访问。
一种方法涉及利用 org.apache.commons.io.IOUtils.copy 方法将输入流内容传输到字节数组中。然后可以使用 ByteArrayInputStream 重复读取此字节数组。
ByteArrayOutputStream baos = new ByteArrayOutputStream(); org.apache.commons.io.IOUtils.copy(in, baos); byte[] bytes = baos.toByteArray();
从那里,您可以遵循以下任一方法:
重复创建 ByteArrayInputStream:
while (needToReadAgain) { ByteArrayInputStream bais = new ByteArrayInputStream(bytes); yourReadMethodHere(bais); }
重置 ByteArrayInputStream:
ByteArrayInputStream bais = new ByteArrayInputStream(bytes); while (needToReadAgain) { bais.reset(); yourReadMethodHere(bais); }
警告: 由于潜在的内存耗尽,将完整流复制到内存中可能不适合大型或无限流。在这种情况下,可能需要替代方法,例如使用缓冲区或单独的数据结构。
以上是如何在不修改输入流的情况下多次读取它?的详细内容。更多信息请关注PHP中文网其他相关文章!