如何克隆输入流但仍然重用原始

时间:2015-09-08 18:26:08

标签: java http url stream

我正在尝试从InputStream复制URLConnection,该HttpInputStream返回类型为HttpUrlConnection的流(内部类URLConnection

在其他情况下,我可以将原始流复制到ByteArrayOutputStream,然后在原始文件上使用mark / reset,但HttpInputStream不支持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 } 内的原始流必须是可读的,因为它被传递到另一个库中。我只需要复制流,这样我就可以读取前两行数据了。以下是我支持标记/重置的流的内容:

var expDate : NSDate = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
expDate = dateFormatter.dateFromString("Sun Apr 19 10:33:18 GST 2009")

2 个答案:

答案 0 :(得分:2)

ImputStream通常不可复制,并且所有流都不支持mark / reset。标准JRE中有一些可能的解决方法。

将InputStream包装到BufferedInputStream中。那个支持在缓冲区大小限制内的标记/重置。这使您可以从头开始读取有限数量的数据,然后重置流。

另一种选择是PushBackInputStream,它允许你“未读”"以前读过的数据。您需要缓冲要自己推回的数据,因此处理它可能有点不方便。

如果整个流不是非常大,您还可以先读取整个流,然后根据需要从预读数据中构造尽可能多的ByteArrayInputStream。仅当数据适合堆中时才可行(例如,最大值小于约2GB)。

答案 1 :(得分:1)