使用java下载图像的最佳和最快方法
我正在使用和评估两种方法(但如果其他方法更好,请告诉我): (1) 使用ImageIO:使用java下载图像的最佳和最快方法,java,image,performance,download,best-in-place,Java,Image,Performance,Download,Best In Place,我正在使用和评估两种方法(但如果其他方法更好,请告诉我): (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);
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的图像只需45毫秒是不够的)。但是在dock中打开一个图标(我正在使用Mac),这让我有点不安
(2) 看起来有点“丑陋的形式”和更低,但它没有打开图标
哪个对你最好?
有新的和旧的方法吗?
你认为有更好的办法吗?
谢谢
编辑:
我对这两种方法的速度进行了新的测试。测量(1)和(2)的执行时间,从第一行(此处示例中编写的代码)之前的行开始。(1)的速度比(2)快10倍。但是从代码开始(java的第一行)开始测量时间(2)比(1)快30%
我认为(1)将真正的下载委托给另一个进程(可能这是dock中弹出的“应用程序”)多亏了@kayaman,我尝试了Files.copy方法,这是我使用过的最好的方法,因为:速度、优雅、代码紧凑: (3) 使用Files.copy()
StandardCopyOption.REPLACE_EXISTING
是可选的,如果您想替换文件(如果文件存在)。我很惊讶地看到任何自定义图像都比原始流快得多。我不熟悉ImageIO,但我想它必须做一些额外的工作。您在解决方案2中尝试过增加缓冲区大小吗?您在这里尝试过公认的anwser吗:考虑到对图像进行解码和重新编码,我很惊讶第一个版本会更快。对于标准库解决方案,我同意。不可能(1)更快。你是怎么测试的?您是否对(2)和(2)使用了相同的图像?你消除了缓存的影响了吗?这和你原来的(2)没有速度上的区别,除了缓冲区大小引起的任何问题,我会增加到至少8192字节。@EJP是的,但我认为(3)比(2)优雅得多。代码更少,更紧凑!你怎么认为?
try (InputStream in = new URL(photoUrl).openStream()) {
Files.copy(in, Paths.get(absoluteDestination + photoId + ".jpg"), StandardCopyOption.REPLACE_EXISTING);
}