http访问第三方系统的接口时,小概率抛出下面的异常:
java.io.IOException: Premature EOF
异常如下:
xxxBiz 推送数据异常
java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565) ~[?:1.8.0_144]
at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:609) ~[?:1.8.0_144]
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:696) ~[?:1.8.0_144]
at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:1.8.0_144]
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3375) ~[?:1.8.0_144]
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_144]
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_144]
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_144]
at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_144]
at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_144]
at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_144]
at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_144]
at com.winchance.hcl.common.util.HttpUtils.inputStream2String(HttpUtils.java:327) ~[classes/:?]
相关代码如下:
public static String post(String address, Map<String, String> headerParameters, String body) throws Exception {
if (body != null) {
return proxyHttpRequest(address, "POST", headerParameters, body);
}
return proxyHttpRequest(address, "POST", null, getRequestBody(headerParameters));
}
public static String proxyHttpRequest(String address, String method, Map<String, String> headerParameters,
String body) throws Exception {
String result = null;
HttpURLConnection httpConnection = null;
try {
httpConnection = createConnection(address, method, headerParameters, body);
String encoding = "UTF-8";
if (httpConnection.getContentType() != null && httpConnection.getContentType().indexOf("charset=") >= 0) {
encoding = httpConnection.getContentType()
.substring(httpConnection.getContentType().indexOf("charset=") + 8);
}
result = inputStream2String(httpConnection.getInputStream(), encoding);
} finally {
if (httpConnection != null) {
httpConnection.disconnect();
}
}
return result;
}
/**
* 读取inputStream 到 string
* @param input
* @param encoding
* @return
* @throws IOException
*/
private static String inputStream2String(InputStream input, String encoding)
throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input,
encoding));
StringBuilder result = new StringBuilder();
String temp = null;
while ((temp = reader.readLine()) != null) {
result.append(temp);
}
return result.toString();
}
上面的代码中:
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
while语句有时会抛出异常:
java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
搜索发现,这个是普遍性的一个问题,解决方法:
https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof
代码如下修改:
/**
* 读取inputStream 到 string
*
* @param input
* @param encoding
* @return
* @throws IOException
*/
private static String inputStream2String(InputStream input, String encoding) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, encoding));
// fix bug: java.io.IOException: Premature EOF
// at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
// https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof
StringBuilder result = new StringBuilder();
int BUFFER_SIZE = 1024;
char[] buffer = new char[BUFFER_SIZE]; // or some other size,
int charsRead = 0;
while ( (charsRead = reader.read(buffer, 0, BUFFER_SIZE)) != -1) {
result.append(buffer, 0, charsRead);
}
return result.toString();
}
原因是第三方接口可能没有发送http协议需要的结束行。