gpt4 book ai didi

java - 如何克隆输入流但仍然重新使用原始流

转载 作者:可可西里 更新时间:2023-11-01 16:30:12 24 4
gpt4 key购买 nike

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

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

有没有办法我仍然可以复制流并重置原始流或防止它被消耗? URLConnection 中的原始流必须是可读的,因为它被传递到另一个库中。我只需要复制流,这样我就可以读取前两行数据。以下是支持标记/重置的流:

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 通常不可克隆,而且并非所有流都支持标记/重置。标准 JRE 中有一些可能的解决方法。

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

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

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

关于java - 如何克隆输入流但仍然重新使用原始流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32464763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com