【问题标题】:How do I repeatedly read from a HttpURLConnection?如何重复读取 HttpURLConnection?
【发布时间】:2011-03-11 20:59:32
【问题描述】:

我编写了一个 Java 程序,它可以从网页中抓取一些内容。它每隔几秒调用一次readWebPage 方法来检索内容。我遇到的问题是只有第一次读取才有效。在我第一次阅读网页后,InputStream 总是显示为空(in.ready() 返回false)。

此外,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();
    }

【问题讨论】:

  • 你是否总是在完成后关闭 Http 连接?
  • 我已经尝试在完成后致电conn.disconnect(),但似乎没有什么不同。

标签: java http web-scraping httpurlconnection


【解决方案1】:

您是否每次都传递相同的HttpURLConnection 对象?如果是,那么由于InputStream 绑定到底层HTTP 连接,您每次都会得到相同的InputStream,而不是考虑到URL 的新流。在将其传递给此方法之前打开一个新连接 (URL#openConnection),您应该一切顺利。

【讨论】:

    【解决方案2】:

    读完整个屏幕后,还有什么要读的?单个 get 或 post 消息不会导致来自服务器的多次传输。它发回一条消息,故事结束。

    如果屏幕仍在更新,则要么 (a) 输入未完成,要么 (b) 进一步的更新不是 HTML,比如有一个小程序或一个 Javascript 函数正在与服务器通信或类似的.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 2013-04-21
      • 2016-04-26
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多