web-dev-qa-db-fra.com

DataOutputSteam me lance une «Java.io.IOException: fin de flux inattendue»?

J'essaie de faire une demande à un WebService à partir d'une application Android, en utilisant HttpUrlConnection. Mais parfois cela fonctionne, et parfois non.

Lorsque j'essaie d'envoyer cette valeur:

Valeur JSON

 {"Calle":"Calle Pérez 105","DetalleDireccion":"","HoraPartida":"May 18, 2014 9:17:10 AM","Numero":0,"PuntoPartidaLat":18.477295994621315,"PuntoPartidaLon":-69.93638522922993,"Sector":"Main Sector"}

J'ai obtenu une exception de "fin de flux inattendue" dans la fonction de fermeture DataOutputStream.

Voici mon code:

DataOutputStream printout;
// String json;
byte[] bytes;
DataInputStream input;

URL serverUrl = null;
try {
    serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
    ...
} 

bytes = json.getBytes();
try {

    httpCon = (HttpURLConnection) serverUrl.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setUseCaches(false);
    httpCon.setFixedLengthStreamingMode(bytes.length);
    httpCon.setRequestProperty("Authorization", tokenType + " "+ accessToken);
    httpCon.setRequestMethod("POST");
    httpCon.setRequestProperty("Content-Type", "application/json");

    printout = new DataOutputStream(httpCon.getOutputStream());
    printout.writeBytes(json);
    printout.flush();
    printout.close();
    ...
}
15
Laggel

Voici une solution avec les modifications suivantes:

  • Il se débarrasse de DataOutputStream, ce qui est certainement la mauvaise chose à utiliser.
  • Il définit et délivre correctement la longueur du contenu.
  • Il ne dépend d'aucune valeur par défaut concernant l'encodage, mais définit explicitement UTF-8 à deux endroits.

Essayez-le:

// String json;

URL serverUrl = null;
try {
    serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
    ...
} 

try {
    byte[] bytes = json.getBytes("UTF-8");

    httpCon = (HttpURLConnection) serverUrl.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setUseCaches(false);
    httpCon.setFixedLengthStreamingMode(bytes.length);
    httpCon.setRequestProperty("Authorization", tokenType + " "+ accessToken);
    httpCon.setRequestMethod("POST");
    httpCon.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

    OutputStream os = httpCon.getOutputStream();
    os.write(bytes);
    os.close();

    ...
}
9
Codo

De la documentation Oracle ici . Nous savons que la méthode de vidage de DataOutputStream appelle la méthode de vidage du flux de sortie sous-jacent. Si vous regardez la classe URLConnection dans ici cela indique que chaque sous-classe de URLConnection doit avoir cette méthode remplacée. Si vous voyez la HttpUrlConnection ici nous voyons que la méthode de vidage n'est pas remplacée. Cela pourrait être l'une des raisons de votre problème.

1
working