• 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

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/digdeep/p/11281722.html
Copyright © 2020-2023  润新知