Java - 重置输入流

2022-09-02 10:30:38

我正在处理一些Java代码,其中有一个我读过一次的InputStream,然后我需要用相同的方法再次阅读它。

问题是我需要将其位置重置为开始,以便读取两次。

我找到了一个黑客式的解决方案:

is.mark(Integer.MAX_VALUE);

//Read the InputStream is fully
// { ... }

try
{
    is.reset();
}
catch (IOException e)
{
    e.printStackTrace();
}

这种解决方案是否会导致一些未经察觉的行为?或者它会在它的愚蠢中起作用?


答案 1

正如所写的,您没有保证,因为不需要报告它是否成功。要获得保证,您必须首先调用markSupported(),并且它必须返回。mark()true

同样如前所述,指定的读取限制非常危险。如果您碰巧使用在内存中缓冲的流,它可能会分配一个 2GB 的缓冲区。另一方面,如果您碰巧使用 ,则没问题。FileInputStream

更好的方法是使用具有显式缓冲区的 。BufferedInputStream


答案 2

这取决于 InputStream 实现。你也可以考虑如果你使用byte[]是否会更好。最简单的方法是使用Apache commons-io

byte[] bytes = IOUtils.toByteArray(inputSream);

推荐