android输入流,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);

#3 热门回答(13 赞)

番石榴的另一种可能性:

依赖性:compile 'com.google.guava:guava:11.0.2'

import com.google.common.io.ByteStreams;

...

String total = new String(ByteStreams.toByteArray(inputStream ));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值