bw=
new
BufferedWriter(fw);
String[] s =
this
.jta.getText().split(
"\n"
);
for
(
int
i =
0
; i < s.length; i++) {
bw.write(s[i]);
bw.flush();
bw.newLine();
}
catch
(Exception e)
e.printStackTrace( );
finally
bw.close();
fw.close();
}
catch
(IOException e)
e.printStackTrace();
报错说
那么是因为一个流关闭了但是你有试着使用它就会报这个异常
比如上面例子
bw.close();
fw.close();
bw流使用了fw流,所以关闭bw流也会关闭fw流;
但是下面有使用fw流,相当于使用一个关闭了的流。解决办法是换下位置就好
fw.
close
();
bw.
close
();
java
.
io
.
IOException
:
Stream
clo
sed
是一个常见的
Java
异常,通常发生在尝试对一个已经关闭的输入/输出流(如 Input
Stream
, Output
Stream
, Reader, Writer 等)执行读写操作时。这个异常是
Java
I/O 框架的一部分,用于指示在 I/O 操作期间发生了某种错误。
spring boot项目,在过滤器、拦截器或自定义aop做统一处理时,获取了request中的input
stream
来获取RequestBody里数据,获取之后在Controller里使用@RequestBody注解再获取就报错:
Stream
clo
sed
。这是因为HttpServletRequest中的input
stream
是不可重复读的。
这块有个疑问:监听器、过滤器、 拦截器、 AOP的执行顺序是什么呢???
如果监听器、过滤器、 拦截器、 AOP都存在,则它们的执行顺序为:监听器 => .
在程序执行过程中,如果我们遇见了以下异常:
java
.
io
.
IOException
:
Stream
clo
sed
.
即
stream
已经被关闭,我们分析一下就很容易知道原因了,即
stream
已经被关闭。那么最有可能的情况就是你多次关闭了
Stream
。
try {
Input
Stream
is = new xxx();
// other codes
is.
clo
se(); //第一次关闭input
Stream
} catch(
IOException
e) {
} finally
is.
clo
se()
java
.
io
.
IOException
: UT010029:
Stream
is
clo
sed
记录一次项目中的异常,在做下载文件时,文件虽然能够导出来但是系统中却出现了一堆报错信息。
java
.
io
.
IOException
: UT010029:
Stream
is
clo
sed
通过报错信息可以看出这个异常是流被关闭了,在我们学
JAVA
基础时我们知道,使用I/O流时要及时关闭。但是如果关闭的不合理也是有问题的,这个错误是由于这个流被关闭了,而在其他地方又用到了这个流,所以获取不到流就会报错了。
定位到了大
FileInput
Stream
input
Stream
= null;
try {
input
Stream
= new FileInput
Stream
("tst.txt");
} catch (FileNotFoundExcept
io
n e) {
e.printStackTrace();
BufferedInput
Stream
bufferedInp...
我们使用了ServletOutput
Stream
来向客户端发送响应。在finally块中不需要关闭输出流,因为Servlet容器会在请求处理完成后自动关闭输出流。如果在finally块中尝试关闭已关闭的输出流,就会抛出
java
.
io
.
IOException
:
Stream
is
clo
sed
异常。因此,我们可以安全地省略关闭输出流的代码。
`
java
.
io
.
IOException
:
Stream
clo
sed
` 异常通常发生在尝试对已关闭的输入/输出流(如 `Input
Stream
`、`Output
Stream
`、`Reader`、`Writer` 等)执行操作时。一旦流被关闭,任何试图读取或写入该流的操作都会抛出这个异常。
### 报错原因
1. **流被错误地关闭了**:在代码中可能不小心提前关闭了流,或者在多线程环境中另一个线程关闭了流。
2. **资源管理的错误**:使用 `try-with-resources` 语句时,流会在
SpirngBoot拦截器(Interceptor)和过滤器(Filter)的操作的如下图所示。OOP编程的思路是封装、继承和多态,而AOP编程的思路是不改变原有接口和功能的基础上提供功能扩展。SpringBoot拦截器和过滤器是Spring Boot的一种机制,用于对请求和响应进行操作的拦截,是AOP编程的一种体现。一般来说,AOP编程的实现思路是提供代理,把一些常用功能如权限检查、日志、事务等,从每个业务方法中剥离出来,而提供代理统一实现。该问题的解决思路是:提供一个复制流,让操作基于复制流。