两次读取 InputStream 的一部分
Posted
技术标签:
【中文标题】两次读取 InputStream 的一部分【英文标题】:Read part of an InputStream twice 【发布时间】:2020-06-25 13:42:16 【问题描述】:我有一个非常大的 ServletInputStream,我想提取 InputStream 的前 X 个字节,然后让流处于初始状态。
我现在所做的是 markSupported()、mark() 和 reset(),但是 markSupported 返回 false,所以我需要实现另一种方法。
描述了here 两次读取输入流的解决方案,但问题是我的流的大小可能非常大,我无法将其全部存储在内存中(此外,我不确定最大数组大小就足够了)。
有没有办法只读取少量字节,然后将流置于初始状态。解决方法是消耗我想要读取的 X 个字节,然后让消耗的流在以下过程之外传递 X 个字节(我想避免)。
【问题讨论】:
如何读取所有ServletInputStream
并将其保存到本地主机上的文件中?
你能把输入流包装在一个 BufferedInputStream 中吗?然后您可以将流标记为重置。
尝试找到markSupported
为真的读者。
Abra 这不是一个选项。拉尔夫谢谢,我已经做到了
【参考方案1】:
你看过java.io.PushbackInputStream
吗?
如果我对您的理解正确,它似乎很适合您想要实现的目标,特别是如果您要检查的字节位于流的开头。
byte[] peekBuffer = new byte[n];
PushbackInputStream pis = new PushbackInputStream(yourStream, peekBuffer.length);
pis.read(peekBuffer);
// Examine peekBuffer
// Reinsert the peeked bytes.
pis.unread(peekBuffer);
【讨论】:
【参考方案2】:BufferedInputStream.markSupported()
返回真(见Javadoc)。只需使用 BufferedInputStream
包装您的流并设置大于 X 的标记限制。
【讨论】:
以上是关于两次读取 InputStream 的一部分的主要内容,如果未能解决你的问题,请参考以下文章
BitmapFactory.decodeStream返回null的 ,InputStream 被调用两次,第一次调用流被关闭清空了!!!