
java 关于CheckedOutputStream 流的操作
FileOutputStreamfileOutputStream=newFileOutputStream(zipFile);CheckedOutputStreamcos=...
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.flush();
上面是代码 compress就是一个自己写的方法。这里我要问的是
我在关闭流的时候,如果把fileOutputStream.close()执行了或者cos.close执行了再去关闭out.close 就会报错。Exception in thread "main" java.io.IOException: Write error
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.util.zip.CheckedOutputStream.write(CheckedOutputStream.java:56)
at org.apache.tools.zip.ZipOutputStream.writeOut(ZipOutputStream.java:828)
at org.apache.tools.zip.ZipOutputStream.deflate(ZipOutputStream.java:547)
at org.apache.tools.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:325)
at org.apache.tools.zip.ZipOutputStream.finish(ZipOutputStream.java:298)
at org.apache.tools.zip.ZipOutputStream.close(ZipOutputStream.java:488)
at com.liym.zip.ZipCompressor.compress(ZipCompressor.java:39)
at com.liym.zip.ZipCompressor.main(ZipCompressor.java:92)
我为什么不能关闭fileOutputStream、cos这两个流呢? 展开
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.flush();
上面是代码 compress就是一个自己写的方法。这里我要问的是
我在关闭流的时候,如果把fileOutputStream.close()执行了或者cos.close执行了再去关闭out.close 就会报错。Exception in thread "main" java.io.IOException: Write error
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.util.zip.CheckedOutputStream.write(CheckedOutputStream.java:56)
at org.apache.tools.zip.ZipOutputStream.writeOut(ZipOutputStream.java:828)
at org.apache.tools.zip.ZipOutputStream.deflate(ZipOutputStream.java:547)
at org.apache.tools.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:325)
at org.apache.tools.zip.ZipOutputStream.finish(ZipOutputStream.java:298)
at org.apache.tools.zip.ZipOutputStream.close(ZipOutputStream.java:488)
at com.liym.zip.ZipCompressor.compress(ZipCompressor.java:39)
at com.liym.zip.ZipCompressor.main(ZipCompressor.java:92)
我为什么不能关闭fileOutputStream、cos这两个流呢? 展开
2个回答
展开全部
都是套管子的,按它们包装的顺序反过来 close,这种设计是 Filtered,就是一层套一套,比如 ZipOutputStream 它只负责 zip 压缩,至于内容最终存放在哪里面是由它的构造函数参数 cos 来负责的,而 Cos 只负责按 CRC 32 检验数据,至于数据本身最终又存放在哪里面是由 fileOutputStream 说得算,因此最终数据需要从管道中输出到 fileOutputStream 中的。其它的 ??? OutputStream 都只是进行一次额外的包装处理(装饰)。
一般来说最外面一层的 OutputStream 在 Close 时会同时让它当初接收的构造函数参数也一起 close,也就是说 out 在 close 时会调用 cos.close(); 而 cos 在 close 时会调用 fileOutputStream.close(); 通常如此,当然可能也有少数例外。
一般来说最外面一层的 OutputStream 在 Close 时会同时让它当初接收的构造函数参数也一起 close,也就是说 out 在 close 时会调用 cos.close(); 而 cos 在 close 时会调用 fileOutputStream.close(); 通常如此,当然可能也有少数例外。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询