两次读取 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);
我有一个可能非常大的 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);