Разобрался в выпуске.
При загрузке и отслеживании количества загруженных данных не используйте read () из BufferedInputStream.
Вместо этого используйте чтение (буфер, смещение, длина);
Я также изменил свой код, чтобы записывать данные в файл по ходу, вместо того, чтобы хранить данные в памяти и выводить их после того, как все данные будут получены.
byte[] baf = new byte[filesize];
int actual = 0;
int count = 0;
long notificationSize = filesize / 100 * 5;
int notifyCount = 0;
while (actual != -1)
{
//write data to file
fos.write(baf, 0, actual);
count += actual;
//only process update once for each kb
if(count > notificationSize * notifyCount)
{
notifier.processUpdate(count);
notifyCount++;;
}
actual = inStream.read(baf, 0, filesize);
}
Я не совсем уверен, почему read () показывает, что он прочитал несколько байтов, когда read () предназначен только для чтения байта за раз.
Если вы действительно хотите использовать read (), измените
count += current;
до
count++;
Это довольно неэффективный способ загрузки, хотя количество циклов в цикле while намного больше. После некоторого краткого тестирования производительности загрузка также кажется более медленной (так как необходимо записать в файл каждый байт вместо части байтов).