Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java下载图像的最佳和最快方法_Java_Image_Performance_Download_Best In Place - Fatal编程技术网

使用java下载图像的最佳和最快方法

使用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);

我正在使用和评估两种方法(但如果其他方法更好,请告诉我):

(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的图像只需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);
}