来自一个InputStream的2个BufferedReaders

时间:2011-10-14 12:22:32

标签: java url

我制作了以下代码:

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秒,具体取决于站点)?

2 个答案:

答案 0 :(得分:2)

我建议您复制整个流,例如通过反复调用read()然后将结果写入ByteArrayOutputStream。然后,您可以从中获取一个字节数组,并在字节数组周围创建多个独立的ByteArrayInputStream包装器。

(您可以使用Guava的ByteStreams.ToByteArray(is)作为第一部分的替代方案。)

另一个替代方法是将原始InputStream包裹在BufferedInputStream中,立即以“足够大”的限制调用mark,然后在阅读完第一行后重置它,在创建第二个BufferedReader之前。

答案 1 :(得分:1)

我不会使用BufferedReader读取第一行,我会读取字符直到找到'\ n'。