我知道有几种方法可以通过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。
不使用RAM从互联网下载文件
这是一个模糊的规范。任何下载都会暂时使用至少少量的内存。这几乎是不可避免的,除非您找到一种直接将字节从网卡流传输到硬盘等文件存储的方法。但是,即使是那些通常在执行写入操作之前,通常也具有内部存储器来存储数据。
如果要避免使用大量RAM空间,则流式传输文件是正确的方法。您正在使用的BufferedReader
不会将整个文件存储到RAM存储器,而只会存储已经到达但尚未写入目标的部分。因此,除非您的输出(硬盘驱动器)阻塞或变慢,否则内存使用率将很低。
但是,如果您的输出通道很慢或阻塞,则您的内存可能会用完。