Java - 重置InputStream

iMi*_*ink 15 java input stream

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

问题是我需要将它的位置重置为开头才能读取它两次.

我找到了解决问题的黑客解决方案:

is.mark(Integer.MAX_VALUE);

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

try
{
    is.reset();
}
catch (IOException e)
{
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案会导致一些未经预料到的行为吗?或者它会愚蠢吗?

kdg*_*ory 10

如上所述,您无法保证,因为mark()不需要报告它是否成功.要获得保证,您必须先调用markSupported(),然后必须返回true.

同样如上所述,指定的读取限制非常危险.如果您碰巧使用缓冲内存的流,则可能会分配2GB缓冲区.另一方面,如果你恰好使用a FileInputStream,你就没事了.

更好的方法是使用BufferedInputStream带有显式缓冲区的a.