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