如何克隆输入流,但仍然重用原来的



我正试图从返回HttpInputStream类型流(HttpUrlConnection的内部类)的URLConnection复制InputStream

在其他情况下,我可以将原始流复制到ByteArrayOutputStream,然后在原始流上使用mark/reset,但HttpInputStream不支持mark/reset。

是否有一种方法我仍然可以复制流并重置原始或保持它不被消耗?URLConnection内部的原始流必须是可读的,因为它被传递到另一个库中。我只需要复制流,这样我就可以读取前两行数据。以下是支持mark/reset的流:

InputStream input = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      input = connection.getInputStream();
      byte[] buffer = new byte[200];
      input.mark(200);
      int len = input.read(buffer);
      input.reset();
      baos.write(buffer, 0, len);
      baos.flush();
      String content = baos.toString("UTF-8");
      //I set flags based on the value of content, but omitting here for the sake of simplicity.
    } catch (IOException ex) {
      //I do stuff here, but omitting for sake of simplicity in this
    }

ImputStreams通常不是可克隆的,也不是所有的流都支持mark/reset。在标准JRE中有一些可能的解决方案。

将InputStream包装成BufferedInputStream。它在缓冲区大小的限制内支持标记/重置。这使您能够从开始读取有限数量的数据,然后重置流。

另一种选择是PushBackInputStream,它允许你"unread"先前读取的数据。但是,您需要自己缓冲要推回的数据,因此处理起来可能有点不方便。

如果整个流不是特别大,您也可以先读取整个流,然后根据预读取的数据构建尽可能多的ByteArrayInputStreams。

Apache公共库有一个非常好的TeeInput流。https://commons.apache.org/proper/commons io/javadocs/api - 1.4 -/- org/apache/commons/io/input/teeinputstream.html

相关内容

  • 没有找到相关文章

最新更新