Mark和reset对于BufferedInputStream不起作用。
问题出现的原因是BufferedInputStream的mark和reset方法不起作用,因为不是所有类型的InputStream都支持mark和reset操作。解决方法是使用org.apache.commons.io.IOUtils.copy方法将InputStream的内容复制到一个字节数组中,然后使用ByteArrayInputStream重复读取字节数组。如果没有对InputStream的读取控制权,则无法使用该解决方法。如果读取的是大文件等大量数据,将所有数据加载到内存中可能会成为一个大问题,因此可以根据实际情况编写更合适的自定义行为。也可以使用IOUtils.toByteArray(InputStream)一次性获取字节数组。
如果你的InputStream支持使用mark,那么你可以使用mark()方法标记你的inputStream,然后使用reset()方法重置它。如果你的InputStream不支持mark,那么你可以使用java.io.BufferedInputStream类,将你的流嵌入到BufferedInputStream中,像这样:
InputStream bufferdInputStream = new BufferedInputStream(yourInputStream);
bufferdInputStream.mark(some_value);
//读取bufferedInputStream
bufferdInputStream.reset();
//再次读取
一个缓冲输入流只能标记回缓冲区的大小,所以如果源不适应,你无法回到开头。
抱歉,但这似乎不正确。看一下BufferedInputStream.fill()方法,有一个"grow buffer"部分,新的缓冲区大小只与marklimit和MAX_BUFFER_SIZE进行比较。
BufferedInputStream
类继承自InputStream
,并且支持mark()
和reset()
方法。但是,根据InputStream
的来源不同,可能无法使用这两个方法进行重置操作。
可以通过调用markSupported()
方法来检查mark()
和reset()
方法是否被支持。如果返回true
,则可以调用reset()
方法将InputStream
重置到初始位置。如果返回false
,则需要从源头再次读取InputStream
。
如果InputStream
不支持标记操作,即调用mark()
方法没有任何效果,调用reset()
方法会抛出异常。
,BufferedInputStream
类支持mark()
和reset()
方法,但是要根据InputStream
的具体实现来确定是否能够使用这两个方法进行重置操作。