我正在尝试使用以下代码阅读网页:
URL url = new URL("somewebsitecomeshere");
URLConnection c = url.openConnection();
if(getHttpResponseCode(c) == 200)
{
if (isContentValid(c))//accept html/xml only!
{
InputStream is = c.getInputStream();
Reader r = new InputStreamReader(is);
System.out.println(r.toString());
//after commenting this everything works great!
setHTMLString(getStringFromReader(r));
System.out.println(getHTMLString());
ParserDelegator parser = new ParserDelegator();
parser.parse(r, new Parser(url), true);
r.close();
is.close();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
log("content is not valid!");
}
else
{
System.out.println("ERROR" + c.getContentType() + c.getURL());
}
//---------------------------------------------------
private String getStringFromReader(Reader reader) throws IOException {
char[] arr = new char[8*1024]; // 8K at a time
StringBuffer buf = new StringBuffer();
int numChars;
while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
buf.append(arr, 0, numChars);
}
//Reset position to 0
reader.reset();
return buf.toString();
}
如果尝试使用getStringFromReader()读取字符串,则由于将Reader的位置更改为EOF而忽略其余代码,因此我尝试将位置重置为0但是我收到以下错误:
java.io.IOException: reset() not supported
at java.io.Reader.reset(Unknown Source)
at sample.getStringFromReader(Spider.java:248)
at default(sample.java:286)
at default.main(sample.java:130)
如何将Reader位置重置为0?
答案 0 :(得分:2)
简短回答,您的信息流不支持重置或标记方法。检查结果:
is.markSupported()
长答案,InputStream是一个字节流。字节可以来自文件,网络资源,字符串等。所以基本上,有些流不支持将读取器位置重置为流的开头,而其他的则(随机访问文件)。
来自网站的流通常会使用底层网络连接来提供数据。这意味着由底层网络协议(例如TCP / IP)来支持或不重置流,通常它们不支持。
为了重置任何流,您必须知道整个流程,从开始到结束。网络通信发送一堆包(可能是否有序)来传输数据。软件包可能会丢失甚至重复,因此通常会在收到信息时对信息进行缓冲和解释。在网络级重建所有消息将是非常昂贵的。所以这通常取决于接收者,如果它想这样做的话。
在你的情况下如果你想要的是打印输入流我建议创建一个自定义的InputStream,它接收原始的InputStream,无论何时读取它都会打印读取值并同时返回它。例如:
class MyInputStream extends InputStream {
InputStream original = null;
public MyInputStream(InputStream original) {
this.original = original;
}
@Override
public int read() throws IOException {
int c = original.read();
System.out.printf("%c", c);
return c;
}
}
然后使用以下内容包装原始InputStream:
.
.
.
InputStream myIs = new MyInputStream(is);
Reader r = new InputStreamReader(myIs);
.
.
.
希望它有所帮助。
答案 1 :(得分:1)
InputStreamReader不支持reset()。此外,您之前没有调用过标记(0)。 您可以做的是将读取器包装在足够大小的BufferedReader中,以便支持重置。如果您不能这样做,那么您应该尝试打开与您的URL的新连接。