Question

Je lis dans le fichier de taille arbitraire dans des blocs de 1021 octets, avec une taille de bloc de <= 1021 octets pour le dernier bloc du fichier. En ce moment, je fais cela à l'aide d'un BufferedInputStream qui est enroulé autour d'un FileInputStream et le code qui ressemble (à peu près) comme les suivants (où reader est le BufferedInputStream et cela fonctionne dans une boucle):

int availableData = reader.available();
int datalen = (availableData >= 1021) 
                ? 1021 
                : availableData;
reader.read(bufferArray, 0, datalen);

Cependant, à la lecture des documents de l'API, je note que available() ne donne qu'une « estimation » de la taille disponible, avant que l'appel serait « bloc ». Impression de la valeur de availableData chaque itération semble donner les valeurs attendues - en commençant par la taille du fichier et obtenir lentement moins jusqu'à ce qu'il soit <= 1021. Étant donné que c'est un fichier local, je me trompe à attendre que ce soit une valeur correcte - est-il une situation où available() donnerait une réponse incorrecte

?

EDIT: Désolé, plus d'informations. Le BufferedInputStream est enroulé autour d'un FileInputStream. À partir du code source pour un FIS, je pense que je suis sûr de compter sur disponibles () en tant que mesure de la quantité de données est laissé dans le cas d'un fichier local. Ai-je raison?

Était-ce utile?

La solution

La question est inutile. Ces quatre lignes de code sont tout à fait équivalent à ceci:

reader.read(buffer, 0, 1021);

sans problème timing-fenêtre, vous avez introduit entre l'appel et la lecture disponible (). Notez que ce code est toujours incorrect que vous ignorez la valeur de retour, qui peut être -1 à EOS, ou toute autre chose entre 1 et 1021 inclus.

Autres conseils

Il ne donne pas la taille estimée, il donne les octets restants qui peuvent être lus. Ce n'est pas une estimation avec BufferedInputStream.

Retourne le nombre d'octets qui peuvent être lu à partir de ce flux d'entrée sans bloquant.

Vous devriez passer available() directement dans l'appel read() si vous voulez éviter le blocage, mais rappelez-vous de revenir si la valeur de retour est 0 ou -1. available() pourrait lancer une exception sur les types de tampons qui ne prennent pas en charge l'opération.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top