我正试图从返回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