我做了以下代码:

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/

10-09 04:08