web-dev-qa-db-ja.com

DataOutputSteamから「Java.io.IOException:予期しないストリームの終わり」がスローされますか?

Androidアプリケーションから、HttpUrlConnectionを使用してWebServiceにリクエストを送信しようとしています。ただし、動作する場合と動作しない場合があります。

この値を送信しようとすると:

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"}

DataOutputStreamのclose関数で「予期しないストリームの終わり」例外が発生しました。

これが私のコードです:

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

以下の変更を加えたソリューションがあります。

  • DataOutputStreamを取り除きます。これは確かに使用するのは間違っています。
  • コンテンツの長さを正しく設定して配信します。
  • エンコーディングに関するデフォルトには依存しませんが、2つの場所でUTF-8を明示的に設定します。

それを試してみてください:

// 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

Oracleのドキュメント here から。 DataOutputStreamのflushメソッドが、基になる出力ストリームのflushメソッドを呼び出すことはわかっています。 here のURLConnectionクラスを見ると、URLConnectionのすべてのサブクラスでこのメソッドをオーバーライドする必要があることを示しています。 HttpUrlConnection here が表示されている場合は、flushメソッドがオーバーライドされていないことがわかります。問題の原因の1つである可能性があります。

1
working