遇到的问题之“一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错:java.io.IOException: Stream closed”
一、问题
遇到的问题之“一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错:java.io.IOException: Stream closed”
二、原因
易宝接口【文件-下载】返回一个压缩流,使用了ZipInputStream zis = new ZipInputStream(result)类来打开ZIP文件,将其中的一个条目作为Excel文件打开。
在读取ZIP文件时,使用getNextEntry()方法来获取到ZIP文件中的下一个条目,逐个读取ZIP文件中的条目并打开它们。
在逐个循环过程中调用WorkbookFactory.create(zis)方法时,可能会导致流关闭。
这是因为WorkbookFactory.create()方法会尝试读取整个输入流。
由于在调用getNextEntry()方法时,ZipInputStream已经指向了ZIP文件中的下一个条目,因此在调用WorkbookFactory.create()方法时,流已经关闭。
因此报错:java.io.IOException: Stream closed

三、解决方案
如果你需要获取下一个XLSX文件的内容,你需要重新创建一个ZipInputStream并指定相应的输入流
@Test
public void wzwDevelopGptFileDownloadTest()
{
// 调用易宝接口 获取【文件-下载】返回的压缩流,前面还有条件封装因为我这里不是特别全且重点不是这里,就没有写了,可以质询易宝相关技术人员
YosDownloadResponse response = yopClient.download(request);
YosDownloadInputStream result = null;
try
{
// 及时关闭文件流,避免连接泄漏
result = response.getResult(); ZipInputStream zis = new ZipInputStream(result);
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null)
{
if (entry.getName().endsWith(".xls") || entry.getName().endsWith(".xlsx"))
{
System.out.println("entry.getName() = " + entry.getName());
// 新建文件流,避免异常:java.io.IOException: Stream closed
Workbook workbook = WorkbookFactory.create(new ByteArrayInputStream(IOUtils.toByteArray(zis))); Sheet sheet = workbook.getSheetAt(0);
// 获取行数
int rowNum = sheet.getLastRowNum();
Row row = null;
for (int i = 1; i < rowNum + 1; i++)
{
row = sheet.getRow(i);
if (row == null)
{
break;
}
int cellNum = 0; // 数据日期
Cell dataDateCell = row.getCell(cellNum++);
String dataDateStr = ExcelUtils.getCellTrimValue(dataDateCell);
System.out.println("dataDateCell = " + dataDateCell);
System.out.println("dataDateStr = " + dataDateStr);
if (StringUtils.isEmpty(dataDateStr))
{
break;
}
}
}
} /*
// 下载压缩包到指定位置
File file = new File("D:/financeExcel/2.zip");
FileOutputStream fileOutputStream = new FileOutputStream(file);
IOUtils.write(IOUtils.toByteArray(result), fileOutputStream);
fileOutputStream.close();*/ zis.close();
}
catch (Exception e)
{
System.out.println("error when download, ex:" + e);
}
finally
{
if (null != result)
{
try
{
result.close();
}
catch (IOException e)
{
}
}
}
}

遇到的问题之“一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错:java.io.IOException: Stream closed”的更多相关文章
- jsp报错java.io.IOException: Stream closed
在使用jsp的时候莫名其妙的抛出了这个异常,经过反复检查 去掉了网友们说的jsp使用流未关闭,以及tomcat版本冲突等原因,最后发现是书写格式的原因. 当时使用的代码如下 <jsp:inclu ...
- java.io.IOException: Stream closed解决办法
1.出现这个bug的大体逻辑代码如下: private static void findMovieId() throws Exception { File resultFile = new File( ...
- java.io.IOException: Stream closed
今天在做SSH项目的时候,出现了这个错误.百思不得其解,网上的答案都不能解决我的问题-.. 后来,一气之下就重新写,写了之后发现在JSP遍历集合的时候出错了. <s:iterator value ...
- java.io.IOException: Stream closed 的问题
public static String getBodyString(ServletRequest request) { StringBuilder sb = new StringBuilder(); ...
- SpringBoot之HandlerInterceptor拦截器的使用 ——(三)获取requestBody解决java.io.IOException: Stream closed
原文地址:https://blog.csdn.net/zhibo_lv/article/details/81875705 感谢原作者
- vue app混合开发蓝牙串口连接(报错java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at js/BluetoothTool.js:329)
我使用的uni-app <template> <view class="bluetooth"> <!-- 发送数据 --> <view c ...
- Caused by: java.io.IOException: Filesystem closed的处理
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to rename output from: hdfs://nameservice/u ...
- 完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径。)
完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径.) 错误原因 读出文件的路径需要有被拷贝的文件名,否则无法解析地址 源代码(用 ...
- java.io.IOException: Attempted read from closed stream
前言: 代码如下,执行的时候提示"java.io.IOException: Attempted read from closed stream." public static JS ...
- 使用HttpClient出现java.io.IOException: Attempted read from closed stream
问题描述: 使用httpClient时候,出现java.io.IOException: Attempted read from closed stream. 原始代码: public static S ...
随机推荐
- c#securityexception不允许所请求的注册表访问权
开机自启动程序如下: if (!System.IO.File.Exists(filename)) throw new Exception("该文件不存在 ...
- Linux服务器部署SpringBoot项目教程
1. 服务器配置1.1 购买服务器1.2 配置安全组1.3 登录实例1.4 安装宝塔面板2. 配置宝塔2.1 创建数据库3. 打包部署项目3.1 修改项目配置3.2 打包3.3 部署3.4 放行端口3 ...
- docker - [07] 部署ES+Kibana
思考问题:以后在Tomcat部署项目,如果每次都要进入容器会十分麻烦,是否可以在容器外部提供一个映射路径,webapps,在外部放置项目,自动同步到容器内部? 一.启动es docker run -d ...
- 【BUUCTF】BabySQli
[BUUCTF]BabySQli 题目来源 收录于:BUUCTF GXYCTF2019 题目描述 纯粹的SQL注入题 随意传入 name=abc&pw=a 返回 wrong user 尝试传入 ...
- python 二级 基本数据类型
1.思维导图 需要特殊记忆知识点 -1.01E-3值为 0.00101 基本运算一共9个: 取整 a//b 取余数 a%b x的y次幂 :x**y 数值运算函数 format 格式的控制 常用的操作 ...
- allure 报告空白
在pycharm 运行py文件后生成的报告内容空白: 尝试方法 替换allure版本号---不好用 用命令生成.html测试报告,再以浏览器形式打开 ** ** 命令 allure generate ...
- Oracle客户端中文显示问号乱码问题
Oracle显示中文显示??乱码 问题如下图 解决方法 打开Oracle客户端,新建一个SQL Window 输入select userenv('language') from dual 复制搜索到的 ...
- centos操作collection
Centos修改IP地址 https://blog.csdn.net/weixin_45193791/article/details/124646170 Centos打开.修改.保存文件 https: ...
- ORACLE忘记用户名和密码、解锁、查询
一.Oracle忘记用户名和密码 1.打开命令提示符,输入命令sqlplus ,进入oracle控制台 2.用户名输入 sqlplus/as sysdba,口令:空(回车即可) 3.连接成功后,输入& ...
- 如何删除Docker Swarm中的Node
好吧,我又回来了...断了那么久主要是因为懒...现在有空会更新一些docker相关的知识.本文主要是总结下在工作中需要管理Docker Swarm中的Node遇到的问题:如何删除一个Swarm中的N ...