2012-07-24 86 views
2

在我的應用程序中,我從公共URL發出請求,然後打開網頁的源代碼,最後,我從源代碼中提取我想要的信息。我在整個過程中沒有問題。但是,加載我想要的信息需要很長時間。有沒有其他有效的方法可以做?如何更有效地從互聯網獲取數據?

public class GetMethodEx { 

    public String getInternetData(String currentUrl) throws Exception{ 
     BufferedReader in = null; 
     String data = null; 
     try{ 
      HttpClient client = new DefaultHttpClient(); 
      URI website = new URI(currentUrl); 
      HttpGet request = new HttpGet(); 
      request.setURI(website); 
      HttpResponse response = client.execute(request); 
      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      StringBuffer sb = new StringBuffer(""); 
      String l = ""; 
      String nl = System.getProperty("line.separator"); 
      while((l = in.readLine()) !=null){ 
       sb.append(l + nl); 
      } 
      in.close(); 
      data = sb.toString(); 
      return data; 
     }finally{ 
      if (in != null){ 
       try{ 
        in.close(); 
        return data; 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

你從哪個網站獲取數據。 THey可能有一個API,可以用來顯着加快此過程。 – 2012-07-24 15:10:14

回答

0

使用StringBuffer實際上效率不高,下載大文本是一個html文件。由於您正在讀取行,因此java必須爲您正在讀取的每行分配內存,以便將所有已複製到內存中的內容複製到StringBuffer中,從而導致激烈的GC工作。然後一個StringBuffer的大小是固定的,所以你的程序可能會超過StringBuffers的大小,導致StringBuffer的大小調整,這會導致Buffer中的所有內容都被複制到一個新的大小。 所以你應該嘗試獲取你請求的html文檔的大小,並將所有內容讀入char數組。這可能不起作用,因爲http允許以可變大小的塊傳輸數據。這是一個想法,你可以做什麼,如果是這樣的話:

String html = ""; 
CharBuffer buff = CharBuffer.allocate(16384); 

int read = in.read(buff); 
while(read > -1) { 
    while(read > -1 && buff.remaining > 0) { 
     read = in.read(buff); 
    } 
    html += new String(buff.array()); 
    buff.clear(); 
} 
+0

如果他將字符串附加到字符串中,那麼您應該是正確的,但與網絡開銷相比,StringBuffer的開銷並不重要。 – EJP 2015-12-14 00:39:08