问题
我正在为我正在制作的Android应用程序的网站发出HTTP get请求。
我正在使用DefaultHttpClient并使用HttpGet发出请求。我得到实体响应,并从中获取一个InputStream对象来获取页面的html。
然后我循环完成回复,如下所示:
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String x = "";
x = r.readLine();
String total = "";
while(x!= null){
total += x;
x = r.readLine();
}
然而,这非常缓慢。
这效率低吗?我没有加载一个大的网页-www.cokezone.co.uk所以文件大小不大。有一个更好的方法吗?
谢谢
安迪
#1 热门回答(321 赞)
你的代码中的问题是它创建了大量的重载物,复制它们的内容并对它们执行操作。相反,你应该使用StringBuilder
来避免在每个追加上创建newString
对象并避免复制char数组。你的案例的实现将是这样的:
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line).append('\n');
}
你现在可以使用23466223而不将其转换为String
,但如果你需要结果为aString
,只需添加:
字符串结果= total.toString();
我会试着更好地解释一下......
- a = b(或a = ab),其中a和b是字符串,将a和b的内容复制到一个新对象(注意你也在复制一个包含累积字符串的a),你正在做每次迭代的那些副本。
- a.append(b),其中a是StringBuilder,直接将b内容附加到a,因此你不会在每次迭代时复制累积的字符串。
#2 热门回答(32 赞)
你是否尝试过内置方法将流转换为字符串?它是Apache Commons库(org.apache.commons.io.IOUtils)的一部分。
然后你的代码就是这一行:
String total = IOUtils.toString(inputStream);
它的文档可以在这里找到:http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString%28java.io.InputStream%29
Apache Commons IO库可以从这里下载:http://commons.apache.org/io/download_io.cgi
#3 热门回答(13 赞)
番石榴的另一种可能性:
依赖性:compile 'com.google.guava:guava:11.0.2'
import com.google.common.io.ByteStreams;
...
String total = new String(ByteStreams.toByteArray(inputStream ));