使用 java 下载图像的最佳和最快方式
Best and fastest way to download an image with java
我正在使用和评估两种方式(但如果其他方式更好,请告诉我):
(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 倍,也许它需要另一个进程,因为我认为45ms 来下载一个 46KB 的图像是不够的)。但是在 Dock 中打开一个图标(我使用的是 Mac),这让我有点不安
(2)好像有点"ugly in the form"和低,但是打不开图标
哪个最适合你?
有新老办法吗?
你认为有更好的方法吗?
谢谢
编辑:
我对这两种方式的速度进行了新的测试。从第一行(此处示例中编写的代码)之前的行开始测量 (1) 和 (2) 的执行时间。 (1) 的速度比 (2) 快 10 倍。但是从代码开始测量时间(.java 的第一行) (2) 比 (1).
快 30%
我想 (1) 将真正的下载委托给另一个进程(也许这是在 dock 中弹出的 "app")。
感谢@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
是可选的。
我正在使用和评估两种方式(但如果其他方式更好,请告诉我):
(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 倍,也许它需要另一个进程,因为我认为45ms 来下载一个 46KB 的图像是不够的)。但是在 Dock 中打开一个图标(我使用的是 Mac),这让我有点不安
(2)好像有点"ugly in the form"和低,但是打不开图标
哪个最适合你? 有新老办法吗? 你认为有更好的方法吗? 谢谢
编辑:
我对这两种方式的速度进行了新的测试。从第一行(此处示例中编写的代码)之前的行开始测量 (1) 和 (2) 的执行时间。 (1) 的速度比 (2) 快 10 倍。但是从代码开始测量时间(.java 的第一行) (2) 比 (1).
快 30%我想 (1) 将真正的下载委托给另一个进程(也许这是在 dock 中弹出的 "app")。
感谢@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
是可选的。