两次读取 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 被调用两次,第一次调用流被关闭清空了!!!

java读取request中的xml

输入输出(I/O)流。

javaIO操作之字节输入流--InputStream

从批处理文件的进程中读取 InputStream 会跳到下一行

如何在不读取 InputStream 的情况下检查 InputStream 是不是为空?