Cela peut être un peu en retard, mais je l'ai récemment travaillé sur quelque chose où je devais connaître la quantité d'octets qui ont été lecture, par opposition à combien sont gauche à lire, comme cette question demande. Mais vous pouvez déduire ce nombre de la solution que j'ai. Je voulais connaître la quantité d'octets lus pour pouvoir suivre la progression du téléchargement (au cas où cela prendrait du temps).
Initialement, j'utilisais simplement DataInputStream # readFully() pour télécharger les fichiers.
buffer = new byte[length];
in.readFully(buffer);
Mais parfois, je suis resté en attente pour aller de 50 - 60 secondes pour que le téléchargement se termine, en fonction de la taille. Je voulais obtenir des mises à jour en temps réel sur la façon dont les choses se passaient, donc j'ai changé pour utiliser uniquement le DataInputStream # read (octet [] b, int off, int len). Donc, il y a là System.out à la fin me disant chaque fois que je l'ai sauté un point de pourcentage:
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 + "%");
}
}
Pour savoir combien d'octets restent à lire, quelques modifications mineures peuvent être apportées au dernier exemple. Avoir une variable de suivi à la place de mon pourcentage, par exemple:
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);
}
Je connais le 'fileSize()'. Je suis d'accord sur 'CountingInputStream', mais cela semble moche (au moins pour moi). –
Je vois ce que vous voulez dire, mais je ne pense pas que ce soit si moche. Une telle classe est assez utile et certainement réutilisable, même dans d'autres situations que pour FileConnections. Et même si c'est légèrement moche, c'est encapsulé et rangé dans une petite classe. – aioobe