在我的应用程序中,我从公共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 :(得分: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();
}