java.net.ProtocolException: la fin inattendue de flux
Je suis confronté à un étrange problème, et je ne suis pas en mesure de le déboguer. J'ai mis en œuvre une logique pour le téléchargement des flux de données et suis à l'aide de Volley pour la même chose, j'ai personnalisé une logique peu dans HurlStack
, addBodyIfExists
de l'api,de sorte que le corps de type "application/octet-stream" peut être manipulé.
Ma logique est d'afficher des progrès de l'utilisateur, de sorte que l'INTERFACE utilisateur peut être mis à jour indiquant à l'utilisateur les progrès en téléchargement, ci-dessous ma logique.
int toRead = length; //File length
byte[] data = new byte[4096];
connection.setDoOutput(true);
if(length != -1) {
connection.setFixedLengthStreamingMode(length);
} else {
connection.setChunkedStreamingMode(4096);
}
OutputStream os;
int i;
int count;
os = connection.getOutputStream();
int progress= 0;
try {
for(i = 0; (count= is.read(data)) > 0; ++i) { //is, is not null and contains a valid input stream
os.write(data, 0, count); //at this line am getting unexpected end of stream
progress+= count;
if(i % 20 == 0) {
rs.deliverProgress(progress, 0L);
progress= 0;
}
}
os.flush();
} finally {
if(is != null) {
is.close();
}
if(os != null) {
os.close();
}
}
sur l'exécution de code ci-dessus reçois ce, bien que j'ai vérifié, les flux de sortie n'est pas nulle, ni faire des flux d'entrée, il échoue dans la première itération de lire en boucle elle-même, je vois qu'il a lu 4096 octets et d'essayer d'en écrire la même chose.
java.net.ProtocolException: unexpected end of stream
at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.close(HttpConnection.java:326)
at com.android.okio.RealBufferedSink.close(RealBufferedSink.java:174)
at com.android.okio.RealBufferedSink$1.close(RealBufferedSink.java:142)
tout aider au débogage des ci-dessus sera-t-il très apprécié.
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "utf-8")); writer.write(...);
au lieu de os.write(...)
Êtes-vous en utilisant un enregistrement à l'intercepteur? Si oui, supprimez-le et exécutez. C'est parce que l'enregistrement de l'intercepteur épuise l'entrée ou la sortie d'un ruisseau, et puis cette exception est déclenchée, lorsque le traitement est sur le point de prendre place.
Je fais face à ce problème dans l'Émulateur
OriginalL'auteur Techfist | 2015-08-24
Vous devez vous connecter pour publier un commentaire.
Cette peut vous aider à :
Que l'exception est levée par FixedLengthInputStream lorsque le nombre d'octets (généralement situé dans la longueur du contenu de l'en-tête de la réponse) est plus grande que les données réelles dans la réponse. Vérifier que le contenu de l'en-tête de longueur est correcte. (Si vous êtes à la fourniture de votre propre valeur pour la longueur du contenu, assurez-vous qu'il est correct).
Aidera à voir votre code qui définit le flux d'entrée.
OriginalL'auteur Saeid