一、问题

遇到的问题之“一个压缩流,多个文件流,在循环文件流时进行文件读时后执行下一个文件流会报错: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”的更多相关文章

  1. jsp报错java.io.IOException: Stream closed

    在使用jsp的时候莫名其妙的抛出了这个异常,经过反复检查 去掉了网友们说的jsp使用流未关闭,以及tomcat版本冲突等原因,最后发现是书写格式的原因. 当时使用的代码如下 <jsp:inclu ...

  2. java.io.IOException: Stream closed解决办法

    1.出现这个bug的大体逻辑代码如下: private static void findMovieId() throws Exception { File resultFile = new File( ...

  3. java.io.IOException: Stream closed

    今天在做SSH项目的时候,出现了这个错误.百思不得其解,网上的答案都不能解决我的问题-.. 后来,一气之下就重新写,写了之后发现在JSP遍历集合的时候出错了. <s:iterator value ...

  4. java.io.IOException: Stream closed 的问题

    public static String getBodyString(ServletRequest request) { StringBuilder sb = new StringBuilder(); ...

  5. SpringBoot之HandlerInterceptor拦截器的使用 ——(三)获取requestBody解决java.io.IOException: Stream closed

    原文地址:https://blog.csdn.net/zhibo_lv/article/details/81875705 感谢原作者

  6. 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 ...

  7. Caused by: java.io.IOException: Filesystem closed的处理

    org.apache.hadoop.hive.ql.metadata.HiveException: Unable to rename output from: hdfs://nameservice/u ...

  8. 完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径。)

    完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径.) 错误原因 读出文件的路径需要有被拷贝的文件名,否则无法解析地址 源代码(用 ...

  9. java.io.IOException: Attempted read from closed stream

    前言: 代码如下,执行的时候提示"java.io.IOException: Attempted read from closed stream." public static JS ...

  10. 使用HttpClient出现java.io.IOException: Attempted read from closed stream

    问题描述: 使用httpClient时候,出现java.io.IOException: Attempted read from closed stream. 原始代码: public static S ...

随机推荐

  1. 【效能提升】测试人员提bug,应该提供哪些信息以便排查问题?

    背景 我们在运维企业级应用时,会遇到很多Bug. 有时候,测试人员或业务方反馈bug,描述得不够详细,我们基于他的描述很难清晰地了解情况,以解决bug. 一般情况下,我们会跟他询问更多的详情,才能知悉 ...

  2. Docker 服务、镜像、容器简单命令使用

    Docker 进程相关命令 启动docker服务: systemctl start docker  查看docker服务状态: systemctl status docker 停止docker服务: ...

  3. Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效

    Jsmoke by Yn8rt ​ 该插件由 Yn8rt师傅 开发,插件可以理解为主动版的hae和apifinder,因为其中的大多数规则我都引用了,当你认为当前页面,以及其调用的js文件存在敏感信息 ...

  4. 面试题54. 二叉搜索树的第k大节点

    地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ <?php /** 面试题54. ...

  5. C# 将list进行随机排序

    private List<T> RandomSortList<T>(List<T> ListT) { Random random = new Random(); L ...

  6. windows mysql8安装zip

    MySQL 是一种广泛使用的关系数据库管理系统,MySQL 8 是其最新的主要版本,结合了出色的性能和丰富的功能. 一.准备工作 1. 下载MySQL 8 zip包 首先,你需要获取MySQL 8的压 ...

  7. vue 判断某个时间小于当前时间

    如下 new Date().getTime() 获取当前时间(毫秒) 我需要对比的时间为秒,所以需要除于1000 <div v-if="scope.row.created_at < ...

  8. Thinkphp8多语言模式,语言包变量占位符实现方法。

    主要实现原理是sprintf()函数,更多占位符写法可以参考sprintf()的介绍. zh-cn.php ...... // 变量用 s% 作为占位符 'sold_books' => 'Sol ...

  9. .NET 10 Preview 2 增强了 Blazor 和.NET MAUI

    .NET 团队 3.18 发布了.NET 10 Preview 2(https://devblogs.microsoft.com/dotnet/dotnet-10-preview-2/)..NET 1 ...

  10. Ubuntu安装GPU驱动+CUDA+cuDNN的安装方法

    一台有GPU的虚拟机如果没有安装CUDA的驱动,是需要我们手动去进行安装的,介绍Ubuntu操作系统的安装教程. 1. 下载安装文件 NVIDIA CUDA Toolkit Archive 点击上面链 ...