两次读取 InputStream 的一部分

Read part of an InputStream twice

我有一个可能非常大的 ServletInputStream,我想提取 InputStream 的前 X 个字节,然后让流处于初始状态。

我现在所做的是 markSupported()、mark() 和 reset(),但 markSupported return 为 false,因此我需要实现其他方法。

描述了一个解决方案 here 来读取输入流两次,但问题是我的流可能非常大,我不能将所有的都放在内存中(而且我不是确保最大数组大小足够)。

有没有办法只读取少量字节,然后将流置于初始状态。解决方法是消耗我想要读取的 X 个字节,然后让消耗的流除了以下过程(我想避免)之外传递 X 个字节。

BufferedInputStream.markSupported() returns 正确(参见 Javadoc)。只需用 BufferedInputStream 包装您的流并设置大于 X 的标记限制。

你看过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);