2011-03-11 75 views
0

我写了一个Java程序,它从网页中删除了一些内容。它通过每隔几秒调用readWebPage方法来检索内容。我遇到的问题是只有第一次阅读实际上有效。在第一次阅读网页后,InputStream总是显示为空(in.ready()返回false)。如何反复读取HttpURLConnection?

而且,conn.getContentLength()每次都会返回相同的值,即使页面上的内容已更改。如果我重新启动程序,新内容将被正确提取。

我错过了什么?我需要在conn对象上执行某种刷新吗?

private String readWebpage(HttpURLConnection conn) throws IOException{ 
      conn.connect(); 
      InputStreamReader in = new InputStreamReader((InputStream) conn.getContent()); 
      BufferedReader buffer = new BufferedReader(in); 
      StringBuilder b = new StringBuilder(conn.getContentLength()+5); 
      String line; 
      while ((line=buffer.readLine())!=null){ 
       b.append(line); 
      } 
      in.close(); 
      buffer.close(); 
      return b.toString(); 
    } 
+0

一旦完成,你是否总是关闭你的Http连接? – 2011-03-11 21:02:53

+0

一旦我完成,我已经尝试调用'conn.disconnect()',但它似乎没有区别。 – 2011-03-11 21:06:06

回答

4

您是否每次都在传递相同的HttpURLConnection对象?如果是,那么因为InputStream与底层的HTTP连接相关联,所以每次都会得到相同的InputStream,而不是考虑URL的新流。在将它传递给此方法之前,打开一个新的连接(URL#openConnection),您应该很好。

+0

谢谢,这解决了我的问题! – 2011-03-12 15:28:10

0

一旦你读完整个屏幕,还有什么可读的?单个获取或发布消息不会导致从服务器进行多次传输。它发回一条消息,结束故事。

如果屏幕仍在更新,那么(a)输入未完成,或者(b)进一步的更新不是HTML,就像有一个小程序或Javascript函数正在与服务器交谈或者这样。

我认为BufferedReader.readLine块只要还有输入,所以我不认为它可能是(a)。如果情况是(b),阅读更多HTML将无济于事:这不会改变。