Это не легко, так как Services.downloadFile()
не дает вам файл кусками.Если бы у вас был цикл, это было бы просто.
Если вы можете изменить API, я предлагаю изменить его следующим образом:
Services.downloadFile(File, OutputStream);
и позволить downloadFile()
записать файлв поток.Теперь вы можете обернуть поток и сосчитать байты, записанные путем перегрузки различных версий write()
.
[EDIT] Я видел, что Services
является прокси RMI.В этом случае вы не можете использовать подход выше.Вместо этого он становится более сложным:
Вам нужен пул загрузок на вашем сервере (подумайте «Карта»).Пул позволяет запрашивать еще один блок данных для каждой загрузки.
Итак, на вашем сервере вам необходимо:
- Создать объект, который обрабатывает загрузку и имеет
byte[] read()
method. - Поместите объекты на карту с помощью ключа.Как-нибудь отправьте ключ клиенту.
- Для каждого объекта создайте поток, который фактически загружает данные и добавляет данные в буфер.Метод
read()
возвращает содержимое буфера и очищает его.
На клиенте:
- Вам необходимо вызвать метод на сервере, чтобы создать новыйзагрузите объект и запустите поток загрузки.
- Теперь вам нужен цикл, который вызывает
read()
для объекта загрузки на сервере.API выглядит примерно так: read(key)
, сервер ищет ключ на карте и затем вызывает read()
для объекта загрузки. - Показывает прогресс по мере записи результата вызовов чтения в файл