报错原因,缓冲区还没填满时关闭了输出流,导致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()。而报错的原因是缓冲区还没填满,如果这时又关闭了输出流。
果然,代码的执行顺序很重要啊。