使用 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 是可选的。