使用java

时间:2015-11-29 17:04:41

标签: 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);    
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”)。

1 个答案:

答案 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是可选的。