我制作了以下代码:
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秒,具体取决于站点)?
答案 0 :(得分:2)
我建议您复制整个流,例如通过反复调用read()
然后将结果写入ByteArrayOutputStream
。然后,您可以从中获取一个字节数组,并在字节数组周围创建多个独立的ByteArrayInputStream
包装器。
(您可以使用Guava的ByteStreams.ToByteArray(is)
作为第一部分的替代方案。)
另一个替代方法是将原始InputStream
包裹在BufferedInputStream
中,立即以“足够大”的限制调用mark
,然后在阅读完第一行后重置它,在创建第二个BufferedReader
之前。
答案 1 :(得分:1)
我不会使用BufferedReader读取第一行,我会读取字符直到找到'\ n'。