我正在尝试从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")
答案 0 :(得分:2)
ImputStream通常不可复制,并且所有流都不支持mark / reset。标准JRE中有一些可能的解决方法。
将InputStream包装到BufferedInputStream中。那个支持在缓冲区大小限制内的标记/重置。这使您可以从头开始读取有限数量的数据,然后重置流。
另一种选择是PushBackInputStream,它允许你“未读”"以前读过的数据。您需要缓冲要自己推回的数据,因此处理它可能有点不方便。
如果整个流不是非常大,您还可以先读取整个流,然后根据需要从预读数据中构造尽可能多的ByteArrayInputStream。仅当数据适合堆中时才可行(例如,最大值小于约2GB)。
答案 1 :(得分:1)
Apache commons库有一个非常好的TeeInput流。 https://commons.apache.org/proper/commons-io/javadocs/api-1.4/org/apache/commons/io/input/TeeInputStream.html