Скачайте файл из inte rnet без использования оперативной памяти и покажите индикатор выполнения - PullRequest
0 голосов
/ 17 апреля 2020

Я понимаю, что есть несколько способов загрузить файл через inte rnet (http)

Если URL для файла (http://hoge.com/foo.dat), отправной точкой будет:

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

и выберите способ обработки потока.

Насколько я понимаю, использование BufferedReader является одним из способов его загрузки и предоставления значений для отображения индикатора выполнения загрузки. Тем не менее, он использует оперативную память (если это не правильно, я рад, хотя ..).

Я считаю, что есть способ загрузки без использования оперативной памяти, как показано ниже:

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

Но в этом случае я не вижу прогресс, отображаемый в индикаторе выполнения.

Скажите, пожалуйста, как загрузить файл и показать прогресс без использования оперативной памяти.

1 Ответ

2 голосов
/ 17 апреля 2020

Загрузка файла из inte rnet без использования оперативной памяти

Это туманная спецификация. Любая загрузка будет временно использовать по крайней мере крошечные объемы памяти. Это почти неизбежно, если только вы не найдете способ напрямую передавать байты с сетевой карты в хранилище файлов, например на жесткий диск. Однако даже те, которые обычно имеют внутреннюю память для хранения данных, перед выполнением операций записи.

Если вы хотите избежать использования большого объема ОЗУ, то потоковый файл - это правильный способ сделать это. BufferedReader, который вы используете, не сохраняет весь файл в оперативной памяти, а только часть, которая уже поступила, но еще не записана в цель. Поэтому, если ваш выход (жесткий диск) не блокируется или не работает медленно, использование памяти будет низким.

Если, однако, ваш выходной канал работает медленно или блокируется, то ваша память может запуститься.

...