【问题标题】:Efficiently read file from URL into byte[] in Java高效地将文件从 URL 读取到 Java 中的 byte[]
【发布时间】:2015-01-16 02:01:50
【问题描述】:

我正在尝试找到一种更有效的方法来从远程 URL 读取文件并将其保存到字节数组中。这是我目前拥有的:

private byte[] fetchRemoteFile(String location) throws Exception {
  URL url = new URL(location);
  InputStream is = null;
  byte[] bytes = null;
  try {
    is = url.openStream ();
    bytes = IOUtils.toByteArray(is);
  } catch (IOException e) {
    //handle errors
  }
  finally {
    if (is != null) is.close();
  }
  return bytes;
}

如您所见,我目前将 URL 传递给该方法,它使用 InputStream 对象来读取文件的字节。此方法使用 Apache Commons IOUtils。但是,此方法调用往往需要相对较长的时间才能运行。当一个接一个地检索数百、数千或数十万个文件时,它会变得非常慢。有没有办法改进这种方法,使其运行更有效?我考虑过多线程,但我想将其保存为最后的手段。

【问题讨论】:

  • 如果没有多线程,您将被限制为一个接一个
  • 代码没有任何问题(除了 byte[] 必须明显适合堆和固有的 2GB 限制的一般限制,但我想你也不介意)。感知到的“缓慢”可能来自 URL 是 http,它需要新的网络连接来检索每个文件(如果有很多小文件,开销会很明显)。除了使用多个请求(即多线程)直接使用 http 1.1 保持连接打开之外,没有太大的潜力来加快速度。
  • @Sotirios 是的,我想知道是否有办法让上面的代码更高效,这样即使一个接一个地运行,它的运行速度也比现在快。我不知道除了多线程之外我是否真的可以做任何事情,但这就是我问的原因
  • 先找出瓶颈在哪里。是网络慢还是服务器或其他什么。只有当你知道你可以考虑优化。例如,如果网络连接很慢,您将无法从多线程中受益。
  • 谢谢大家,这就是我所倾向于的。我仍在努力进行一些性能测试以确定哪些部分是最慢的,但只是想看看我是否可以对我已有的部分做出明显的改进。非常感谢!

标签: java file optimization bytearray apache-commons-io


【解决方案1】:

你的做法似乎完全没问题。

但如果你说:

"但是,这个方法调用往往需要比较长的时间 跑”

您可能会遇到以下问题:

  • 网络、连接问题

  • 您确定在单独的线程中下载每个文件吗?

如果您为此使用多线程,请确保 VM args -XmsYYYYM-XmxYYYYM 配置良好,因为如果没有,您可能会遇到问题,您的处理器不会使用所有核心。我前段时间遇到过这个问题。

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 2015-06-21
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多