java.io.IOException: Premature EOF
http访问第三方系统的接口时,小概率抛出下面的异常:
java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
at com.xxxxx.util.HttpUtil.getHttpsContent(HttpUtil.java:194)
相关代码如下:
public static JSONObject getMsgRetry(String url, JSONObject json) throws IOException{url = url + "?a=1";
for(Entry<String, Object> entry : json.entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
url = url+"&"+key+"="+value;
}
HttpsURLConnection conn = HttpUtil.initHttpsConnectionKeepAlive(url, "GET");
String result = "";
try{
result = HttpUtil.getHttpsContent(conn, "utf-8");
}catch(Exception e){
logger.error("interface_error, let's retry.");
logger.error(e.toString());
try {
TimeUnit.SECONDS.sleep(2); // 延迟2秒,再重试
} catch (InterruptedException e1) {
logger.error(e1.toString());
}
result = HttpUtil.getHttpsContent(conn, "utf-8");
}finally{
conn.disconnect();
}
return JSONObject.parseObject(result);
}
public static String getHttpsContent(HttpsURLConnection conn,String characterCode) throws IOException {
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, characterCode);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
conn.disconnect();
return buffer.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
代码如下修改:
public static String getHttpsContent(HttpsURLConnection conn, String characterCode) throws IOException {InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, characterCode);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
// 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
StringBuffer sb = new StringBuffer();
int BUFFER_SIZE = 1024;
char[] buffer = new char[BUFFER_SIZE]; // or some other size,
int charsRead = 0;
while ( (charsRead = bufferedReader.read(buffer, 0, BUFFER_SIZE)) != -1) {
sb.append(buffer, 0, charsRead);
}
return sb.toString();
}
搞定。原因是第三方接口可能没有发送http协议需要的结束行。
The issue for you it may be that the server is not pushing that last end line character
以上是 java.io.IOException: Premature EOF 的全部内容, 来源链接: utcz.com/z/391469.html