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的更多相关文章
- hadoop MR 任务 报错 "Error: java.io.IOException: Premature EOF from inputStream at org.apache.hadoop.io"
		错误原文分析 文件操作超租期,实际上就是data stream操作过程中文件被删掉了.一般是由于Mapred多个task操作同一个文件.一个task完毕后删掉文件导致. 这个错误跟dfs.datano ... 
- spark 执行报错 java.io.EOFException: Premature EOF from inputStream
		使用spark2.4跟spark2.3 做替代公司现有的hive选项. 跑个别任务spark有以下错误 java.io.EOFException: Premature EOF from inputSt ... 
- hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available
		一.异常现象 更改了hadoop的配置文件:core-site.xml 和 mapred-site.xml 之后,重启hadoop 和 hbase 之后,发现hbase日志中抛出了如下异常: ... 
- java.io.IOException: mark/reset not supported
		java.io.IOException: mark/reset not supported at java.io.InputStream.reset(InputStream.java:348) at ... 
- java.io.IOException: invalid header field
		通过本文, 我们明白了什么是 jar的清单文件 MANIFEST.MF, 简单示例: E:\ws\Test\WEB-INF\classes>jar cvfm testCL.jar ListTes ... 
- java.io.IOException: Cannot run program "jad"
		今天调试google tag manager, 需要看看google analytics source code,无奈没有源码,装个一个插件ejad 还是不行: java.io.IOException ... 
- org.apache.hadoop.ipc.RemoteException(java.io.IOException)
		昨晚突然之间mr跑步起来了 jps查看 进程都在的,但是在reduce任务跑了85%的时候会抛异常 异常情况如下: 2016-09-21 21:32:28,538 INFO [org.apache.h ... 
- android java.io.IOException: open failed: EBUSY (Device or resource busy)
		今天遇到一个奇怪的问题, 测试在程序的下载界面,下载一个文件第一次下载成功,删除后再下载结果下载报错, 程序:file.createNewFile(); 报错:java.io.IOException: ... 
- java.io.IOException: 您的主机中的软件中止了一个已建立的连接解决办法
		问题现象和http://hi.baidu.com/cara_cloud/item/193a3ee327546d395a2d64be描述的一样,就是在eclipse的console栏中一直显示java. ... 
随机推荐
- 《深度学习框架PyTorch:入门与实践》读书笔记
			https://github.com/chenyuntc/pytorch-book Chapter2 :PyTorch快速入门 + Chapter3: Tensor和Autograd + Chapte ... 
- docker 修改gwbridge ip address
			docker_gwbridge介绍 docker_gwbridge接口为使用多主机群覆盖网络的所有容器和任务提供默认网关功能.它是在每个Docker主机上创建的,当它们加入集群时.如果接口docker ... 
- 第08组 Beta版本演示
			简介 组名:955 组长博客:点这里! 成员 031702329庄锡荣(组长) 031702309林晓锋 031702309侯雅倩 031702311陈珊珊 171709030吴珂雨 03170231 ... 
- 【Activiti学习之五】BPMN事件
			环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.事件定义1.定时器事件(1)timeDate:指定时间触发<timerEven ... 
- 【c# 学习笔记】c#委托是什么
			法庭上律师为当事人辩护,他真正执行的是当事人的陈词,律师就相当于一个委托对象,而当事人则委托律师对象为自己辩护. c#中的委托概念也就好比律师对象,它是一个类(“委托是类类型”这个事实将在“委托本质” ... 
- Typescript 学习 - 类
			class class 并不是一种新的数据结构,只是在函数原型基础上的语法糖 class People { hand: number; constructor(hand: number) { this ... 
- python安装 hanlp +使用     坑坑坑。。。填填填。。。
			刚开始用都不知道要怎么安装,包括什么文件.百度了下发现正常安装就可以用,不用下多余的东西,但是但是但是但是但是但是但是但是 用pycharm安装不行,pip安装不行,也是见鬼了. 解决方法: 1.手动 ... 
- [转帖]Hikari 数据源介绍
			Hikari 数据源介绍 jimmy・2018 年 09 月 23 日・默认分类 预估 https://izhong.me/index.php/archives/78/ 介绍 官网地址: https: ... 
- nginx php上传大小设置
			来源:http://blog.51yip.com/apachenginx/1751.html 
- springboot yml配置文件注入值
			1.编写javabean: package com.example.springboot.bean; import org.springframework.boot.context.propertie ... 
