我做了以下代码:
try {
URL url = new URL("http://bbc.com");
is = url.openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
System.out.println(in.readLine());
//in.close(); with this next lines throw java.io.IOException: stream is closed
in = new BufferedReader(new InputStreamReader(is, "iso-8859-2"));
System.out.println(in.readLine().length());
} catch (Exception ex) {
ex.printStackTrace();
}
问题是几乎每个程序运行后,第二个BufferedReader开始从几个不同的点开始读取(打印长度不同)。相同的编码也会出现相同的问题。如何在不创建新InputStream的情况下读取编码,然后使用此编码读取内容(每次创建新InputStream都需要0.1到3 s,具体取决于站点)?
最佳答案
我建议您复制整个视频流,例如通过重复调用read()
,然后将结果写入ByteArrayOutputStream
。然后,您可以从中获取一个字节数组,并围绕该字节数组创建多个独立的ByteArrayInputStream
包装器。
(您可以使用番石榴的ByteStreams.ToByteArray(is)
作为第一部分的替代方法。)
另一种选择是将原始InputStream
包装在BufferedInputStream
中,立即以“足够大”的限制调用mark
,然后在阅读第一行之后重置它,然后再创建第二个BufferedReader
。
关于java - 来自一个InputStream的2个BufferedReader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7767497/