【问题标题】:Read part of an InputStream twice两次读取 InputStream 的一部分
【发布时间】:2020-06-25 13:42:16
【问题描述】:

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

我现在所做的是 markSupported()、mark() 和 reset(),但是 markSupported 返回 false,所以我需要实现另一种方法。

描述了here 两次读取输入流的解决方案,但问题是我的流的大小可能非常大,我无法将其全部存储在内存中(此外,我不确定最大数组大小就足够了)。

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

【问题讨论】:

  • 如何读取所有ServletInputStream 并将其保存到本地主机上的文件中?
  • 你能把输入流包装在一个 BufferedInputStream 中吗?然后您可以将流标记为重置。
  • 尝试找到markSupported为真的读者。
  • Abra 这不是一个选项。拉尔夫谢谢,我已经做到了

标签: java inputstream


【解决方案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 的标记限制。

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2018-10-24
      • 1970-01-01
      • 2017-05-04
      • 2021-12-19
      相关资源
      最近更新 更多