【问题标题】:Best and fastest way to download an image with java使用 java 下载图像的最佳和最快方法
【发布时间】:2015-11-29 17:04:41
【问题描述】:

我正在使用和评估两种方法(但如果有其他更好的方法告诉我):

(1) 使用 ImageIO:

URL url = new URL(photoUrl);    
BufferedImage image = ImageIO.read(url);
ImageIO.write(image, "jpg", new File(absoluteDestination + photoId + ".jpg"));

(2) 使用 FileOutputStream

URL url = new URL(photoUrl);    
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(absoluteDestination + photoId + ".jpg");

byte[] b = new byte[2048];
int length;

while ((length = is.read(b)) != -1) {
    os.write(b, 0, length);
}
is.close();
os.close();

(1) 对我来说似乎更聪明,更快大约快 10 倍,也许它需要另一个进程,因为我认为 45 毫秒下载一个 46KB 的图像不是足够)。但是在 Dock 中打开一个图标(我使用的是 Mac),这让我有点不安

(2) 看起来有点“形式难看”和lower,但是并没有打开图标。

哪个最适合你? 有新的和旧的方法吗? 你认为有更好的方法吗? 谢谢

编辑:

我对这两种方法的速度进行了新的测试。从第一行之前的行开始测量(1)和(2)的执行时间(此处示例中编写的代码)。 (1) 的速度比 (2) 快 10 倍。但是从代码开始(.java 的第一行)开始测量时间(2)比(1)快 30%

我认为 (1) 将真正的下载委托给另一个进程(也许这是在 Dock 中弹出的“应用程序”)。

【问题讨论】:

  • 我很惊讶地看到任何自定义的图像都比原始流快得多。我不熟悉 ImageIO,但我想它必须做一些额外的工作。您是否尝试在解决方案 2 中增加缓冲区大小?
  • 你有没有试过这里接受的anwser:stackoverflow.com/a/4697271/4358405
  • 我很惊讶第一个版本会更快,因为它正在对图像进行解码和重新编码。
  • 对于标准库解决方案,我会选择Files.copy
  • 不可能(1)更快。你是怎么测试的?您对 (2) 和 (2) 使用了相同的图像吗?您是否消除了缓存的影响?

标签: java image performance download best-in-place


【解决方案1】:

感谢@kayaman,我尝试了 Files.copy 方法,这是我用过的最好的方法,因为:速度、优雅、代码紧凑:

(3) 使用 Files.copy()

try (InputStream in = new URL(photoUrl).openStream()) {
    Files.copy(in, Paths.get(absoluteDestination + photoId + ".jpg"), StandardCopyOption.REPLACE_EXISTING);
}

StandardCopyOption.REPLACE_EXISTING 是可选的,如果你想替换文件(如果文件存在的话)。

【讨论】:

  • 这和你原来的 (2) 没有速度差异,除了缓冲区大小引起的,我会增加到至少 8192 字节。
  • @EJP 是的,但我认为 (3) 比 (2) 优雅得多。更少的代码,更紧凑!你怎么看?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多