Android有效地从输入流中读取

问题

我正在为我正在制作的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 ));