2012-07-24 98 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