尝试将Reader重置为0位置时,为什么会出现异常错误?

时间:2012-03-06 23:19:50

标签: java streamreader

我正在尝试使用以下代码阅读网页:

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?

2 个答案:

答案 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的新连接。