首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从输入流高效读取Android

从输入流高效读取Android
EN

Stack Overflow用户
提问于 2010-03-22 12:15:39
回答 12查看 274.2K关注 0票数 161

我正在为我正在制作的android应用程序向一个网站发出HTTP请求。

我使用DefaultHttpClient并使用HttpGet发出请求。我得到实体响应,并从中获取用于获取页面html的InputStream对象。

然后我循环一遍答复,如下所示:

代码语言:javascript
运行
复制
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,所以文件大小不是很大。有更好的方法吗?

谢谢

安迪

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2010-03-30 22:42:01

代码中的问题是,它正在创建大量沉重的String对象,复制它们的内容并对它们执行操作。相反,您应该使用StringBuilder来避免在每个追加中创建新的String对象,并避免复制char数组。您的案例的实现如下所示:

代码语言:javascript
运行
复制
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
for (String line; (line = r.readLine()) != null; ) {
    total.append(line).append('\n');
}

现在可以使用total而不必将其转换为String,但是如果需要将结果作为String,只需添加:

字符串结果= total.toString();

我会尽量解释的更好..。

  • a += b (或a = a + b),其中ab是字符串,将 a b的内容复制到一个新对象(注意,您还在复制a,其中包含E 120累加E 221/code>D 22),并且在每个D26是D 27的情况下,直接将b复制到a,所以每次迭代时都不复制累积的字符串。<F 231>代码>
票数 362
EN

Stack Overflow用户

发布于 2010-08-24 00:27:13

您是否尝试过内置方法将流转换为字符串?它是Apache (org.apache.commons.io.IOUtils)的一部分。

那么您的代码将是这一行:

代码语言:javascript
运行
复制
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库可以从这里下载:http://commons.apache.org/io/download_io.cgi

票数 35
EN

Stack Overflow用户

发布于 2015-04-20 20:48:32

番石榴的另一种可能性是:

依赖关系:compile 'com.google.guava:guava:11.0.2'

代码语言:javascript
运行
复制
import com.google.common.io.ByteStreams;
...

String total = new String(ByteStreams.toByteArray(inputStream ));
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2492076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档