【发布时间】:2020-03-12 14:09:31
【问题描述】:
我正在尝试为图像编写一个批量下载器。从URLConnection 获取 InputStream 很容易,但下载所有文件需要一段时间。使用多线程确实可以加快速度,但是有很多线程下载文件可能会占用大量内存。这是我发现的:
让in 成为InputStream、file 目标File 和fos 一个FileOutputStream 到file
简单的方法
fos.write(in.readAllBytes());
读取整个文件,写入返回的byte[]。可能可用于获取网站源,对于较大的文件(例如图像)没有好处。
编写块
byte[] buffer = new byte[bufsize];
int read;
while ((read = in.read(buffer, 0, bufsize)) >= 0) {
fos.write(buffer, 0, read);
}
对我来说似乎更好。
in.transferTo(fos)
in.transferTo(fos);
在内部写入块,如上所示。
文件.copy()
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
似乎使用本机实现。
当并行执行数十次时,我应该使用其中哪一个来最小化内存使用量?
这是一个有趣的小项目,外部库对于那个 IMO 来说太过分了。我也不能使用ImageIO,因为它不能处理 webms、一些 pngs/jpgs 和动画 gif。
编辑:
这个问题是基于并发写入是可能的假设。但是,情况似乎并非如此。我可能会同时获取图像链接,然后一个接一个地下载它们。无论如何感谢您的回答!
【问题讨论】:
-
当并行执行数十次时,我应该使用其中哪一个来最小化内存使用量? 没有。不要并行复制数十次。这将需要比串行执行复制更多的内存,并且由于写入操作阻塞而需要更多的时间。
-
我的措辞不好。它使用 InputStream 将数据从在线图像复制到文件中。此外,每张图片都会被下载到一个单独的文件中,因此阻止应该不是问题。
-
这些单独的文件是否也在单独驱动器上的单独文件系统上?那么,同时写入文件 1 和文件 2 不会阻塞?很抱歉,这不正确。
-
好吧,我不知道