我正在为我正在制作的android应用程序向一个网站发出HTTP请求。
我使用DefaultHttpClient并使用HttpGet发出请求。我得到实体响应,并从中获取用于获取页面html的InputStream对象。
然后我循环一遍答复,如下所示:
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,所以文件大小不是很大。有更好的方法吗?
谢谢
安迪
发布于 2010-03-30 22:42:01
代码中的问题是,它正在创建大量沉重的String对象,复制它们的内容并对它们执行操作。相反,您应该使用StringBuilder来避免在每个追加中创建新的String对象,并避免复制char数组。您的案例的实现如下所示:
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),其中a和b是字符串,将 a 和 b的内容复制到一个新对象(注意,您还在复制a,其中包含E 120累加E 221/code>D 22),并且在每个D26是D 27的情况下,直接将b复制到a,所以每次迭代时都不复制累积的字符串。<F 231>代码>发布于 2010-08-24 00:27:13
您是否尝试过内置方法将流转换为字符串?它是Apache (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库可以从这里下载:http://commons.apache.org/io/download_io.cgi
发布于 2015-04-20 20:48:32
番石榴的另一种可能性是:
依赖关系:compile 'com.google.guava:guava:11.0.2'
import com.google.common.io.ByteStreams;
...
String total = new String(ByteStreams.toByteArray(inputStream ));https://stackoverflow.com/questions/2492076
复制相似问题