我正在处理一些Java代码,其中有一个我读取了一次的InputStream,然后我需要以相同的方法再次读取它。
问题是我需要将其位置重置为开头才能读取两次。
我找到了一个解决该问题的黑客式解决方案:
is.mark(Integer.MAX_VALUE);
//Read the InputStream is fully
// { ... }
try
{
is.reset();
}
catch (IOException e)
{
e.printStackTrace();
}
这个解决方案会导致一些意想不到的行为吗?或者它会在它的愚蠢中发挥作用?
正如所写,你没有任何保证,因为mark()
不需要报告是否成功。要获得保证,您必须先致电标记支持() http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#markSupported%28%29,并且它必须返回true
.
同样如所写,指定的读取限制是非常危险的。如果您碰巧使用在内存中缓冲的流,它可能会分配 2GB 缓冲区。另一方面,如果您碰巧使用FileInputStream
, 你没事。
更好的方法是使用BufferedInputStream
具有显式缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)