Java IO包装流如何关闭?(关闭顺序)
来源:互联网 发布:网络高级工程师认证 编辑:程序博客网 时间:2024/05/18 00:33
转载1:Java IO流关闭问题的深入研究
转载2:Java IO包装流如何关闭?(关闭顺序)
两种分析过程不一样,但是结论相差不大:
(个人认为转载1分析的比较透彻)
一般情况下是:先打开的后关闭,后打开的先关闭;另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法如果将节点流关闭以后再关闭处理流,会抛出IO异常;
问题:
(1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗?
(2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭?
问题(1)解释:
如下例子代码: FileInputStream is = new FileInputStream("."); BufferedInputStream bis = new BufferedInputStream(is); bis.close();从设计模式上看:java.io.BufferedInputStream是java.io.InputStream的装饰类。BufferedInputStream装饰一个 InputStream 使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码: java.io.BufferedInputStream的api:closepublic void close()throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:
public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("d:\\a.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); bw.write("java IO close test"); bw.close(); }验证ok
问题(2)解释:如果不想使用(1)方式关闭流,可以逐个关闭流(可能大家比较习惯吧)
如下例子: public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("d:\\a.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); bw.write("java IO close test"); //从内带外顺序顺序会报异常 fos.close(); osw.close(); bw.close(); }报出异常:Exception in thread "main" java.io.IOException: Stream closed at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:26) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:99) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190) at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111) at java.io.BufferedWriter.close(BufferedWriter.java:246) at com.my.test.QQ.main(QQ.java:22)如下例子: public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("d:\\a.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); bw.write("java IO close test"); // 从外到内顺序关闭ok bw.close(); osw.close(); fos.close(); }验证ok
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常;
阅读全文
0 0
- Java IO包装流如何关闭?(关闭顺序)
- java IO包装流如何关闭?
- Java IO包装流如何关闭?
- Java IO包装流如何关闭?
- 【JAVA】IO流关闭顺序
- io流关闭顺序
- JAVA IO 流的关闭顺序!
- java IO 关闭顺序分析
- java文件IO,关闭顺序
- java中io各种流的关闭顺序
- java中io各种流的关闭顺序
- java中io各种流的关闭顺序
- java中io各种流的关闭顺序
- Java中IO各种流的先后关闭顺序
- Java IO之写入流关闭关闭顺序
- IO流操作后 关闭顺序
- java io 流的关闭
- JAVA——IO流 之 节点流和处理流以及流的关闭顺序(5)
- 系统学习深度学习(四十)--MS-CNN
- 逼格高又实用的Linux高级命令,开发运维都要懂
- 判断某个对象是否是空对象
- [中等] UVa OJ 12186 Another Crisis
- 简谈JAVA基础--单链表
- Java IO包装流如何关闭?(关闭顺序)
- 笔记本不显示“选择关闭盖子的功能”
- 小技巧
- Eclipse中Web项目出现感叹或红叉该怎么解决?
- java 运算符
- Flum+hdfs
- CasperJS API 第三篇
- ThreadLocal使用
- docker问题汇总