java.io.IOException: Stream closed`异常的正确解决方法,亲测有效,嘿嘿嘿

【Spring】数据导出为Excel的接口报java.io.IOException: UT010029: Stream is closed错误 文件下载接口不能有返回值。。。。。。。。。。因为接口被调用后`response`会自动关闭`ServletOutputStream`,而return时会再次自动关闭`OutputStream`,就会导致Stream is closed 阅读详情

问题分析

java.io.IOException: Stream closed 异常通常发生在尝试对已关闭的输入/输出流(如 InputStreamOutputStreamReaderWriter 等)执行操作时。一旦流被关闭,任何试图读取或写入该流的操作都会抛出这个异常。

报错原因

  1. 流被错误地关闭了:在代码中可能不小心提前关闭了流,或者在多线程环境中另一个线程关闭了流。
  2. 资源管理的错误:使用 try-with-resources 语句时,流会在 try 代码块结束后自动关闭,如果在该块外再次尝试使用它,就会引发异常。
  3. 流被多次关闭:有时候代码中存在逻辑错误,可能导致流被多次关闭。

解决思路

  1. 检查流关闭的位置:确保流在不再需要时才被关闭,而不是在可能还需要使用流之前就关闭它。
  2. 避免在 try-with-resources 外部使用流:如果使用了 try-with-resources,则确保在 try 块内完成所有与流相关的操作。
  3. 添加逻辑检查:在尝试使用流之前,检查它是否已关闭。

解决方法

下滑查看解决方法

方法一:确保流在正确的位置关闭
InputStream inputStream = null;
try {
    inputStream = new FileInputStream("file.txt");
    // ... 使用 inputStream 进行操作 ...
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// 确保不在这里或之后使用 inputStream,因为它已经被关闭了
方法二:使用 try-with-resources 自动管理资源
try (InputStream inputStream = new FileInputStream("file.txt")) {
    // ... 使用 inputStream 进行操作 ...
    // 无需显式关闭 inputStream,它会在 try 块结束时自动关闭
} catch (IOException e) {
    e.printStackTrace();
}
// 不要在这里或之后使用 inputStream,因为它已经不在作用域内了
方法三:添加逻辑检查以避免对已关闭的流进行操作
InputStream inputStream = new FileInputStream("file.txt");
boolean isClosed = false;
try {
    // ... 使用 inputStream 进行操作 ...
} catch (IOException e) {
    if (e.getMessage().equals("Stream closed")) {
        // 处理流已关闭的情况
        isClosed = true;
    } else {
        e.printStackTrace();
    }
} finally {
    if (!isClosed && inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:在实际应用中,方法三中的逻辑检查可能并不是最佳实践,因为它依赖于异常消息的特定内容,这可能会因Java版本或不同的库实现而有所变化。更常见的是使用 try-with-resources 或确保在正确的位置关闭流。

Hadoop报错Caused by: java.io.IOException: Stream closed问题 【问题现象】 这几天离线计算平台有个别计算作业运行失败,排查原因,查看平台日志,报错关键信息如下: WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.Error: org.apache.hive.s 阅读详情

相关推荐

记一次多线程写入文件出现IOExceptionStream Closed的问题

网关在解析1000个05文件(txt)写入到SFTP文件时,是每次读取1000 * 5条数据,然后每1000笔数据创建一个线程逐条数据进行字段数值映射转换,一共创建5个线程扔到线程池进行处理。每条数据解析完都会将数据写入到SFTP的DAT文件,并且累加条数写入到CTL文件。原来是1000笔数据才进行解析,每个文件造数据10条,导入没问题。为了方便试,把条数调小到每次读取5 * 2 条数据,每个文件有10条数据,方便验证多线程读取有无问题。

一蓑烟雨任平生 1393

JAVA异常 java.io.IOException Stream closed解决办法

在程序执行过程中,如果我们遇见了以下异常java.io.IOException: Stream closed.stream已经被关闭,我们分析一下就很容易知道原因了,即stream已经被关闭。那么最有可能的情况就是你多次关闭了Stream。 例如: try { InputStream is = new xxx(); // other codes is.close(); //第一次关闭inputStream } catch(IOException e) { } finally { is.close()

m0_67402013的博客 3万+

java ,返回流,IOException: Stream Closed,TryWithResource

Java 1.7中新增的try-with-resource语法糖来打开资源,而无需码农们自己书写资源来关闭代码 为了能够配合try-with-resource,资源必须实现AutoClosable接口。该接口的实现类需要重写close方法: public class ConnectionClone implements AutoCloseable { public void sen...

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 1293

Java异常 java.io.IOException: Stream closed解决办法

在程序执行过程中,如果我们遇见了以下异常java.io.IOException: Stream closed.stream已经被关闭,我们分析一下就很容易知道原因了,即stream已经被关闭。那么最有可能的情况就是你多次关闭了Stream。 例如: try { InputStream is = new xxx(); // other codes is.close(

极品小肥羊的博客 5万+

java.io.IOException:stream closed 异常的原因及处理

一、close 顺序异常 FileInputStream inputStream = null; try { inputStream = new FileInputStream("tst.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); } BufferedInputStream bufferedInp...

casual_clover的博客 2万+

java.io.IOException: Stream closed`异常解决方案

java.io.IOException: Stream closed 是一个常见的 Java 异常,通常发生在尝试对一个已经关闭的输入/输出流(如 InputStream, OutputStream, Reader, Writer 等)执行读写操作时。这个异常Java I/O 框架的一部分,用于指示在 I/O 操作期间发生了某种错误。

2301_79779756的博客 5212

java.io.IOException: Stream closed的问题排查

最近开发“导出数据生成文件”功能时使用到多处OutputStream流操作。 如导出excel文件: //创建outputStream response.setContentType("APPLICATION/OCTET-STREAM"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipName.concat(".zip"), "UTF-8"));

HY—Chan 6073

获取ServletInputStream之后报错:java.io.IOException: Stream closed

今天在给一个项目加日志切面,在从request里面获取body参数时,报错:java.io.IOException: Stream closed。 先看一下相关代码。 private String printToLogStringByRequestBody(HttpServletRequest request) { String body = ""; ServletInputStream inputStream = null; try {

OrangQceee的博客 3599

java.io.IOException: stream is closed

下载的地方有断点就是导致stream关闭---java.io.IOException: stream is closed public Integer downFileJpg(String filePath) throws Exception { // feign文件下载 File file =new File(localCache); //如果文件夹不存在则创建 if (!file.exists() && !...

yuhui666666的博客 2907

java IO 关闭顺序分析

相信基于java io 编过程的朋友们,或多或少,都会遇到java.io.IOException: Stream closed这种异常。归根到底,是我们在关闭各种IO流的时候,没有注意到顺序。 下面,结合我对IO的理解,分析一下,究竟怎么样正确关闭。 读过jdk io 源码的朋友们应该知道,它使用了一种叫装饰器模式来组织类的。举个实例代码来说:     FileOutputStream fo

Code-lover's Learning Notes 1153

java io流不关闭_Java中的io流关闭问题

java.io.IOException:Streamclosedatjava.io.BufferedWriter.ensureOpen(UnknownSource)atjava.io.BufferedWriter.write(UnknownSource)atjava.io.Writer.write(UnknownSource)atComm...java.io.IOException: Stream...

weixin_29080843的博客 845

java循环写入文件,Java写入文件。使用循环

I have a simple application that yet would trash a text file (it's just practice) I'm only 3 days with Java yet. Problem is there are no errors until you run the program then it throws an exception an...

weixin_31936393的博客 1781

java.io.IOException: Stream closed

bug处理

weixin_45875060的博客 2370

java.io.IOException: Stream closed,关于设置拦截器获取post请求的参数,出现的流关闭问题

java.io.IOException: Stream closed,关于设置拦截器获取post请求的参数,出现的流关闭问题

weixin_48788601的博客 8157

报错解决java.io.IOException: Stream closed

报错解决java.io.IOException: Stream closed

qq_59670390的博客 1867

多线程下文件输出流被关闭:IOException:Stream closed

1、改为方法局部变量2、使用本地线程

qq_45672914的博客 3176
上一篇: Android中生成二维码
下一篇: MySQL密码遗忘的三种解决方法
代码无疆
博客等级 码龄2年 4万+粉丝 305原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值