【问题标题】:BufferedReader running extremely slowBufferedReader 运行速度极慢
【发布时间】:2015-09-12 21:37:48
【问题描述】:

我正在从我的网络服务器下载一张图片,如下所示:

conn = url.openConnection();
conn.setDoOutput(true);
wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();

rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((resp = rd.readLine()) != null) {
    downloadedImage += resp;
}

但是它非常慢。下载一个 500kb 的文件大约需要 15 秒。有没有更好的下载图片的方法?

以防万一:文件格式为 x 行,每行 80 个 UTF-8 字符。保持换行符并不重要。

谢谢

【问题讨论】:

  • 我的第一个猜测是这里最薄弱的环节是网络/服务器,而不是 BufferedReader。

标签: java php android download bufferedreader


【解决方案1】:

我猜这里最薄弱的环节是网络/服务器,但无论如何,你可以稍微提高while 循环的性能。

使用+= 基本上会在您调用它时创建一个新的StringBuilder 。所以string1 += string2 与调用string1 = new StringBuilder(string1).append(string2).toString(); 是一样的。显然,你永远不会在运行x 次的循环中执行此操作。因此,请在开始循环之前创建 一个 StringBuilder,并在完成后调用 toString()

StringBuilder stringBuilder = new StringBuilder(downloadedImage);
while ((resp = rd.readLine()) != null) {
    stringBuilder.append(resp);
}
downloadedImage = stringBuilder.toString();

如果循环不经常运行,性能提升可能不会那么大,但由于您正在下载图像,我想它会运行很多次。

【讨论】:

  • 嗯,看来您对主机的看法是正确的...我尝试通过 chrome 下载文件,大约需要 10 秒。也感谢 StringBuilder 的提示,我不知道每次连接时都会创建一个新的!
  • @Nat 很高兴为您提供帮助。此外,还有一个小小的“良好做法”:如果你还没有这样做,只是在你的问题中切断了那条线,你应该在循环之后关闭 InputStream
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 2016-02-29
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多