java.io.IOException: Stream Closed 缓冲流初探

报错原因,缓冲区还没填满时关闭了输出流,导致BufferedOutputStream关闭时执行flush强制写入失败。
今天在使用BufferedOutputStream写入图片时突然报错,这是代码:
FileOutputStream fos=new FileOutputStream(file);
BufferedOutputStream bos=new BufferedOutputStream(fos);
try{
bos.write(b.toByteArray);
}finally{
if(fos!=null)
fos.close();
if(bos!=null)
bos.close();
}
Debug发现是在bos.close()的时候出错了。
起先,找到写入的文件,发现是0kb,说明write没有写入。直接修改调用FileOutputStream 的write方法:
FileOutputStream fos=new FileOutputStream(file);
try{
fos.write(b.toByteArray);
}finally{
if(fos!=null)
fos.close();
}
可以正常执行,但是效率会变低并且没有找出问题。

查找资料,发现BufferedOutputStream调用write方法时,先将数据写入到缓冲区,直到写满这个缓冲区才会把缓冲区 中的数据一次性写入到文件中。因此有flush方法帮助小容量的内容写入内存,强制将还没有装满的缓冲区数据写入底层io中。
FileOutputStream fos=new FileOutputStream(file);
BufferedOutputStream bos=new BufferedOutputStream(fos);
try{
bos.write(b.toByteArray);
bos.flush();
}finally{
if(fos!=null)
fos.close();
if(bos!=null)
bos.close();
}
成功执行,但是这就结束了吗,并不是:
FileOutputStream fos=new FileOutputStream(file);
BufferedOutputStream bos=new BufferedOutputStream(fos);
try{
bos.write(b.toByteArray);
}finally{
if(bos!=null)
bos.close();
if(fos!=null)
fos.close();
}
跟最开始的代码完全一样,只是close的顺序换了。原来bos.close()里面会执行flush()。而报错的原因是缓冲区还没填满,如果这时又关闭了输出流。
果然,代码的执行顺序很重要啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"java.io.IOException: Stream closed"是一个常见的错误消息,它表示在处理输入或输出时出现了问题。在Java中,输入和输出是用于读取和写入数据的工具。 通常情况下,抛出这个异常的原因是由于输入或输出在操作之前已被关闭。当我们使用JavaIO类进行输入或输出操作时,我们需要按照一定的顺序正确关闭,以避免出现此错误。 在遇到这个错误消息时,我们可以检查以下几个方面: 1. 检查是否正确地打开和关闭了输入或输出。在使用完之后,我们应该使用`close()`方法来关闭。 例如,在读取文件时,我们应该使用以下代码片段: ```java try { FileInputStream file = new FileInputStream("myfile.txt"); // 读取文件的代码逻辑 } catch (IOException e) { e.printStackTrace(); } finally { try { if (file != null) { file.close(); // 关闭 } } catch (IOException e) { e.printStackTrace(); } } ``` 2. 检查代码中是否存在多个线程尝试共享同一个。当多个线程同时对同一个进行操作时,可能会导致其中一个线程关闭了,而其他线程尝试读取或写入数据时抛出"Stream closed"异常。确保在多线程环境中正确同步的访问。 3. 检查对象是否被重复使用。有时我们可能会在多个地方使用相同的对象进行读写操作。如果在一次操作之后关闭了,在后续操作中再次使用该对象将导致"Stream closed"异常。确保每次操作都使用一个新的对象。 总之,当遇到"java.io.IOException: Stream closed"异常时,我们应该仔细检查的打开和关闭过程,确保在正确的时间关闭,并避免多个线程或重复使用对象造成的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值