我正在使用和评估两种方式(但如果其他更好的方法告诉我):
(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倍,也许它需要另一个进程的东西,因为我认为下载46KB图像的45ms不是足够)。但是在Dock中打开一个图标(我正在使用Mac),这让我有点不安
(2)似乎有点“丑陋的形式”和低级,但它没有打开图标。
哪个最适合你? 有新旧方法吗? 你认为有更好的方法吗? 感谢
修改
我对两种方法的速度进行了新的测试。测量从第一行之前的行开始的(1)和(2)的执行时间(这里的例子中写的代码)。 (1)的速度比(2)快10倍。但是测量从代码开始的时间(.java的第一行)(2)比(1)快30%。
我认为(1)将真正的下载委托给另一个进程(也许这是在Dock中弹出的“app”)。
答案 0 :(得分:0)
感谢@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
是可选的。