【发布时间】: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