java.io.IOException: Premature EOF

java

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

回到顶部