在不使用 RAM 的情况下从互联网下载文件并显示进度条
Download a file from internet without using RAM and show a progress bar
我知道有几种方法可以通过互联网 (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 的情况下下载文件并显示进度。
Download a file from internet without using RAM
这是一个模糊的规范。任何下载都会暂时使用至少少量的内存。这几乎是不可避免的,除非你找到一种方法将字节从网卡直接流式传输到像硬盘驱动器这样的文件存储中。然而,即使是那些通常在执行写操作之前也有内部存储器来存储数据。
如果您想避免使用大量 RAM space,那么流式传输文件是正确的方法。您正在使用的 BufferedReader
不会将整个文件存储到 RAM 内存中,而只会存储已经到达但尚未写入目标的部分。因此,除非您的输出(硬盘驱动器)阻塞或变慢,否则内存使用率会很低。
但是,如果您的输出通道很慢或阻塞,那么您的内存可能 运行。
我知道有几种方法可以通过互联网 (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 的情况下下载文件并显示进度。
Download a file from internet without using RAM
这是一个模糊的规范。任何下载都会暂时使用至少少量的内存。这几乎是不可避免的,除非你找到一种方法将字节从网卡直接流式传输到像硬盘驱动器这样的文件存储中。然而,即使是那些通常在执行写操作之前也有内部存储器来存储数据。
如果您想避免使用大量 RAM space,那么流式传输文件是正确的方法。您正在使用的 BufferedReader
不会将整个文件存储到 RAM 内存中,而只会存储已经到达但尚未写入目标的部分。因此,除非您的输出(硬盘驱动器)阻塞或变慢,否则内存使用率会很低。
但是,如果您的输出通道很慢或阻塞,那么您的内存可能 运行。