无需使用RAM从Internet下载文件并显示进度条

问题描述 投票:0回答:1

我知道有几种方法可以通过Internet(http)下载文件

如果文件的URL为(http://hoge.com/foo.dat),则起点为:

new URL("http://hoge.com/foo.dat").openStream();

并选择如何处理流。

据我了解,使用BufferedReader是下载它并提供值以显示下载进度条的一种方法。但是,它使用RAM(如果不正确,我还是很高兴..)。

我发现有一种不使用RAM的下载方法,如下所示:

new FileOutputStream("foo.dat").getChannel()
.transferFrom(
Channels.newChannel(new URL("http://hoge.com/foo.dat").openStream()),
0, Long.MAX__VALUE
);

但是在这种情况下,我看不到进度条中显示的进度。

[请告诉我如何下载文件并显示进度而不使用RAM。

java nio
1个回答
0
投票

不使用RAM从互联网下载文件

这是一个模糊的规范。任何下载都会暂时使用至少少量的内存。这几乎是不可避免的,除非您找到一种直接将字节从网卡流传输到硬盘等文件存储的方法。但是,即使是那些通常在执行写入操作之前,通常也具有内部存储器来存储数据。

如果要避免使用大量RAM空间,则流式传输文件是正确的方法。您正在使用的BufferedReader不会将整个文件存储到RAM存储器,而只会存储已经到达但尚未写入目标的部分。因此,除非您的输出(硬盘驱动器)阻塞或变慢,否则内存使用率将很低。

但是,如果您的输出通道很慢或阻塞,则您的内存可能会用完。

© www.soinside.com 2019 - 2024. All rights reserved.