Mark和reset对于BufferedInputStream不起作用。

9 浏览
0 Comments

Mark和reset对于BufferedInputStream不起作用。

如何重复读取相同的输入流?有没有办法复制它?

我需要从网络上获取一张图片,将其保存到本地,然后返回保存的图片。我只是觉得使用相同的流比起启动一个新的流来读取下载的内容再次读取会更快。

0
0 Comments

问题出现的原因是BufferedInputStream的mark和reset方法不起作用,因为不是所有类型的InputStream都支持mark和reset操作。解决方法是使用org.apache.commons.io.IOUtils.copy方法将InputStream的内容复制到一个字节数组中,然后使用ByteArrayInputStream重复读取字节数组。如果没有对InputStream的读取控制权,则无法使用该解决方法。如果读取的是大文件等大量数据,将所有数据加载到内存中可能会成为一个大问题,因此可以根据实际情况编写更合适的自定义行为。也可以使用IOUtils.toByteArray(InputStream)一次性获取字节数组。

0
0 Comments

如果你的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进行比较。

0
0 Comments

BufferedInputStream类继承自InputStream,并且支持mark()reset()方法。但是,根据InputStream的来源不同,可能无法使用这两个方法进行重置操作。

可以通过调用markSupported()方法来检查mark()reset()方法是否被支持。如果返回true,则可以调用reset()方法将InputStream重置到初始位置。如果返回false,则需要从源头再次读取InputStream

如果InputStream不支持标记操作,即调用mark()方法没有任何效果,调用reset()方法会抛出异常。

BufferedInputStream类支持mark()reset()方法,但是要根据InputStream的具体实现来确定是否能够使用这两个方法进行重置操作。

0