DataOutputSteam正在给我一个“java.io.IOException:意外的流结束”?

我正在尝试使用HttpUrlConnection从Android应用程序向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关闭函数中得到了一个“意外的流结束”异常。

这是我的代码:

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();
    ...
}

答案 1

下面是具有以下更改的解决方案:

  • 它摆脱了DataOutputStream,这当然是错误的使用方法。
  • 它正确设置和传递内容长度。
  • 它不依赖于有关编码的任何默认值,而是在两个位置显式设置 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();

    ...
}

答案 2

从预言机文档这里。我们知道 DataOutputStream 的 flush 方法调用底层输出流的 flush 方法。如果你看一下这里的URLConnection类,它说URLConnection的每个子类都必须重写此方法。如果你在这里看到 HttpUrlConnection,我们看到 flush 方法没有被覆盖。这可能是您出现问题的原因之一。


推荐