Это может быть немного поздно, но я недавно работал над чем-то, где мне нужно было узнать количество байтов, которые были прочитаны , а не сколько осталось нужно прочитать, так как этот вопрос задает. Но вы можете получить это число из решения, которое я получил. Я хотел узнать количество прочитанных байтов, чтобы отслеживать ход загрузки (если это заняло какое-то время).
Сначала я просто использовал DataInputStream # readFully () для загрузки файлов.
buffer = new byte[length];
in.readFully(buffer);
Но иногда мне оставалось ждать от 50 до 60 секунд для завершения загрузки, в зависимости от размера. Я хотел получать обновления в реальном времени о том, как идут дела, поэтому я решил использовать обычное чтение DataInputStream # (byte [] b, int off, int len). Итак, в конце есть System.out, который сообщает мне, когда я прыгнул на процентное значение:
buffer = new byte[length];
int totalRead = 0;
int percentage = 0;
while (totalRead < length)
{
int bytesRead = in.read(buffer, totalRead, (length - totalRead));
if (bytesRead < 0)
throw new IOException("Data stream ended prematurely");
totalRead += bytesRead;
double progress = ((totalRead*1.0) / length) * 100;
if ((int)progress > percentage)
{
percentage = (int)progress;
System.out.println("Downloading: " + percentage + "%");
}
}
Чтобы узнать, сколько байтов осталось прочитать, можно внести некоторые незначительные изменения в последний пример. Наличие переменной трекера вместо моего процента, например:
buffer = new byte[length];
int totalRead = 0;
int bytesLeft= 0;
while (totalRead < length)
{
bytesLeft = length - totalRead;
int bytesRead = in.read(buffer, totalRead, bytesLeft);
if (bytesRead < 0)
throw new IOException("Data stream ended prematurely");
totalRead += bytesRead;
System.out.println("Bytes left to read: " + bytesLeft);
}