遇到的问题之“一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错: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 ...
随机推荐
- Nginx~启动!!
前言 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.r ...
- ABB机器人伺服电机维修有脉冲输出时不工作怎么处理
1.ABB机器人伺服电机维修有脉冲输出时不工作怎么处理? 监督操控器的脉冲输出当时值以及脉冲输出灯是否闪烁,承认指令脉冲现已履行并现已正常输出脉冲:查看操控器到驱动器的操控电缆,动力电缆,编码器电缆是 ...
- 2024年最新iOS 17屏蔽系统更新方法,iPhone、iPad通用!
到Safari浏览器打开,描述文件会自动安装进手机里. 这时候我们在设置里,找到设备管理,点击刚刚下载好的描述文件,进行安装.要注意看,有苹果的签名,才说明是官方出品,千万要注意哦!安装完成后,重启手 ...
- Shell - shell中的数组
Shell 数组用括号来表示,元素用 "空格" 符号分隔开,语法格式如下: arrName = (value1 value2 value3)(这种方式带值) 往数组里添加值,数组的 ...
- UE5 C++ 程序进程退出
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include ...
- 晶振测试仪GDS-80系列参数
晶振测试仪GDS-80系列 一.产品简介 晶振测试仪GDS-80系列是高性价比的晶振测试系统,采用网络分析技术,实现智能化测量,符合IEC-444标准.测量频率范围10KHz-200KHz,1MHz- ...
- DeFi(去中心化金融)的硬核知识
1. DeFi流动性挖矿:躺着赚利息的"矿工" 简单来说,流动性挖矿就像你往银行存钱赚利息,但这里存的是加密货币,利息更高,还能随时提现.比如你往Uniswap这样的去中心化交 ...
- PHP中&&与and、||与or的区别
https://blog.csdn.net/asty9000/article/details/80652064 在PHP中,&&与and都表示逻辑与,||与or都表示逻辑或,并且它们都 ...
- Cordova基本使用(二)
cordova的打包发布版app流程简介 除了第一遍官网给的打包发布版的方法,我们可以自己多敲几次命令来实现. 基本上使用如下的几个命令就完成这个过程,先列出整个过程: 1.cordova选定ando ...
- 请求方法:GET 与 POST
根据 RFC 规范,GET 的语义是从服务器获取指定的资源,GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览 ...