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的更多相关文章

  1. hadoop MR 任务 报错 &quot;Error: java.io.IOException: Premature EOF from inputStream at org.apache.hadoop.io&quot;

    错误原文分析 文件操作超租期,实际上就是data stream操作过程中文件被删掉了.一般是由于Mapred多个task操作同一个文件.一个task完毕后删掉文件导致. 这个错误跟dfs.datano ...

  2. spark 执行报错 java.io.EOFException: Premature EOF from inputStream

    使用spark2.4跟spark2.3 做替代公司现有的hive选项. 跑个别任务spark有以下错误 java.io.EOFException: Premature EOF from inputSt ...

  3. hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available

    一.异常现象 更改了hadoop的配置文件:core-site.xml  和   mapred-site.xml  之后,重启hadoop 和 hbase 之后,发现hbase日志中抛出了如下异常: ...

  4. java.io.IOException: mark/reset not supported

    java.io.IOException: mark/reset not supported at java.io.InputStream.reset(InputStream.java:348) at ...

  5. java.io.IOException: invalid header field

    通过本文, 我们明白了什么是 jar的清单文件 MANIFEST.MF, 简单示例: E:\ws\Test\WEB-INF\classes>jar cvfm testCL.jar ListTes ...

  6. java.io.IOException: Cannot run program "jad"

    今天调试google tag manager, 需要看看google analytics source code,无奈没有源码,装个一个插件ejad 还是不行: java.io.IOException ...

  7. org.apache.hadoop.ipc.RemoteException(java.io.IOException)

    昨晚突然之间mr跑步起来了 jps查看 进程都在的,但是在reduce任务跑了85%的时候会抛异常 异常情况如下: 2016-09-21 21:32:28,538 INFO [org.apache.h ...

  8. android java.io.IOException: open failed: EBUSY (Device or resource busy)

    今天遇到一个奇怪的问题, 测试在程序的下载界面,下载一个文件第一次下载成功,删除后再下载结果下载报错, 程序:file.createNewFile(); 报错:java.io.IOException: ...

  9. java.io.IOException: 您的主机中的软件中止了一个已建立的连接解决办法

    问题现象和http://hi.baidu.com/cara_cloud/item/193a3ee327546d395a2d64be描述的一样,就是在eclipse的console栏中一直显示java. ...

随机推荐

  1. [PHP] windows下tee指令

    在win下使用tee指令 tee为Linux指令,tee把日志输出到log的同时输出到屏幕. 在 http://sourceforge.net/projects/unxutils/?source=dl ...

  2. Huffman树与Huffman编码

    1.Huffman树 今天复习Huffman树.依稀记得自己被Huffman树虐的经历.还记得是7月份,我刚开始看数据结构与算法,根本看不懂Huffman树的操作.后来我终于悟出了Huffman树是怎 ...

  3. 安装Ruby 2.3.0

    安装最新的redis集群需要用到的rb脚本要ruby2.3.0版本,centos7默认的是2.0.0,很显然报错不行,所以安装呗,使用rvm安装,安装步骤如下: yum -y install curl ...

  4. 安卓设备连接Mac的简单方法

    mac设备是苹果出品的桌面系统,以高冷而闻名,不同于我们平常使用的windows系统,mac系统对软件硬件的兼容性很差,将iOS 设备(iPhone.iPad和iPod)连接至Mac是一件很简单的事, ...

  5. ssl证书转换cer转pem

    .pem证书转.cer证书 openssl x509 -outform der -in demo.pem -out demo.cer .cer证书转.pem证书 openssl x509 -infor ...

  6. 死磕Java内部类

    Java内部类,相信大家都用过,但是多数同学可能对它了解的并不深入,只是靠记忆来完成日常工作,却不能融会贯通,遇到奇葩问题更是难以有思路去解决.这篇文章带大家一起死磕Java内部类的方方面面. 友情提 ...

  7. c# 3d图像显示

    1.应用directx图形库进行开发: 2.代码: public class TClass : System.Windows.Forms.Form { /// <summary> /// ...

  8. windows server 2016 安装网卡驱动

    首先,联网分解为两个问题,一.WLAN(无线网).二.以太网(有线网) 一 .WLAN问题解决方案 1.打开服务器管理器 2.添加角色和功能 3.一直点下一步到“功能”,勾选 DirectPlay 和 ...

  9. 竟然重新用回Eclipse,得重新熟悉那些快捷键了!

    自动补全快捷键:补全后半部分,Alt + /:不全等号及等号前半部分(就是返回类型),Ctrl + 1: 未完待续~

  10. [转帖]kubernetes 常见问题整理

    kubernetes 常见问题整理 https://www.cnblogs.com/qingfeng2010/p/10642408.html 使用kubectl 命令报错 报错: [root@k8s- ...