安卓系统有效地从输入流中读取

2022-08-31 07:14:35

我正在向我正在制作的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

代码中的问题是它创建了许多重对象,复制它们的内容并对其执行操作。相反,您应该使用 以避免在每次追加时创建新对象,并避免复制 char 数组。您的案例的实现将如下所示:StringStringBuilderString

BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
for (String line; (line = r.readLine()) != null; ) {
    total.append(line).append('\n');
}

现在,您可以在不将其转换为 的情况下使用,但是如果您需要将结果作为 ,只需添加:totalStringString

String result = total.toString();

我会试着更好地解释它...

  • a += b(or ),其中 和 是 Strings,则将两者的内容复制到一个新对象(请注意,您也在复制 ,其中包含累积的 ),并且您正在每次迭代中执行这些副本。a = a + bababaString
  • a.append(b),其中 是 ,直接将内容追加到 ,因此您不会在每次迭代时复制累积的字符串。aStringBuilderba

答案 2

您是否尝试过将流转换为字符串的内置方法?它是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


推荐