• 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

  • 相关阅读:
    SPI masterslave驱动框架分析
    linux内存分配方法总结
    C#图片适应PictureBox大小显示
    .NET下的AO对象的安全释放
    .net C# PropertyGrid 显示下拉列表
    Oracle事务细节问题
    C#中Remoting的IPC通信之Winform与Windows服务通信错误问题及解决
    windows服务的安装与卸载
    windows环境下Oracle数据库冷备份和恢复全过程
    OGR连接数据源读取矢量数据图层(C#)
  • 原文地址:https://www.cnblogs.com/digdeep/p/11281722.html
Copyright © 2020-2023  润新知