都是套管子的,按它们包装的顺序反过来 close,这种设计是 Filtered,就是一层套一套,比如 ZipOutputStream 它只负责 zip 压缩,至于内容最终存放在哪里面是由它的构造函数参数 cos 来负责的,而 Cos 只负责按 CRC 32 检验数据,至于数据本身最终又存放在哪里面是由 fileOutputStream 说得算,因此最终数据需要从管道中输出到 fileOutputStream 中的。其它的 ??? OutputStream 都只是进行一次额外的包装处理(装饰)。
一般来说最外面一层的 OutputStream 在 Close 时会同时让它当初接收的构造函数参数也一起 close,也就是说 out 在 close 时会调用 cos.close(); 而 cos 在 close 时会调用 fileOutputStream.close(); 通常如此,当然可能也有少数例外。
关闭的时候是从内向外关