- 浏览: 31135 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (42)
- java (14)
- struts2 (2)
- oracle (2)
- 正则表达式 (1)
- linux (3)
- groovy (1)
- tomcat (2)
- spring (3)
- struts1 (0)
- JVM (1)
- eclipse (1)
- netbeans (0)
- 安全 (0)
- jsp/servlet (1)
- 学习心得 (1)
- 项目管理 (1)
- 流媒体 (1)
- 职业规划 (1)
- php (1)
- 架构 (0)
- UML (0)
- jdbc (0)
- 学习计划 (1)
- maven (1)
- mysql (2)
- git (0)
- hibernate (1)
- 测试工具 (0)
- 设计模式 (0)
- 面试准备 (1)
最新评论
援引了一位网友的解释, 自己稍加改动, 保存留用
(1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗?
(2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭?
问题(1)解释:
如下例子代码:
从设计模式上看:
java.io.BufferedInputStream是java.io.InputStream的装饰类。
BufferedInputStream装饰一个 InputStream 使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。
BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:
java.io.BufferedInputStream的api:
close
public void close()throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
复制代码
因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:
验证ok
问题(2)解释:如果不想使用(1)方式关闭流,可以逐个关闭流(可能大家比较习惯吧)
如下例子:
报出异常:
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)
如下例子:
验证ok
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流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:
close
public 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异常;
发表评论
-
常用JVM 监控工具
2016-03-07 11:15 3301. jConsole JConsole是一 ... -
常用数据库连接池
2016-03-04 16:07 443dbcp - DBCP(DataBase conn ... -
bit与字节Byte的区别和联系
2015-01-23 14:40 936bit中文名称是位,音译“比特”,是用以描述电脑数据量的最 ... -
tomcat70源码导入Eclipse
2014-12-28 01:37 547最近想研究一下tomcat的源码,费了好些劲才将其顺利导入 ... -
配置使用连接池的httpClient
2014-11-27 19:51 3261httpClient4.3开始弃用了DefaultHttp ... -
RestTemplate用法
2016-03-02 16:26 605RestTemplate 这篇文章 ... -
java序列化java.io.Externalizable(转)
2014-05-22 08:00 583这次我们讲的是控制对象的序列化和反序列化 控制序列化就是 ... -
为什么hashcode要使用31这个数
2014-05-21 15:11 707散列计算就是计算元素应该放在数组的哪个元素里。准确的说是放到哪 ... -
spring Aop 事务控制
2014-04-04 19:37 606做开发几年了,一直也没搞清楚spring的事务传播性怎么回事, ... -
java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloa
2014-03-17 17:08 534重装系统后原来项目中的单元测试跑不了,报错Caused by: ... -
java处理大txt
2012-12-11 17:37 919java 读取txt,java读取大文件 packa ... -
Class和ClassLoader的 getResource方法的区别
2012-11-14 15:48 827比如一个类A的包声明 为 p1.p2.p3 那么我们在调用 A ... -
安装jdk7,用java -version查看确是jkd1.4.x
2012-10-26 09:30 825新做的系统,发现eclipse启不来了,jdk没有安装,然后在 ...
相关推荐
buffer方法:将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小。 2. closeQueitly方法:关闭流。 3. contentEquals方法:比较两个流中的内容是否一致。 4. copy方法:将输入流中的内容拷贝到输出流...
Socket.IO 的流模块 这个库是对节点模块的更新。 没有进行代码更改,但已更新debug模块以避免现有项目中的安全... 要接收流,您只需用node-socketio-stream包装socket ,然后像往常一样监听任何事件。 服务器: v
(简单的理解为包装流,就是将字节流包装以下,方便操作文本相关的文件) * 使用场景: * 别人给提供了字节流,而需要处理文本文件,这时候,就需要用转换流转换一下,更方便处理文本文件 * * 作用:...
它也有一个方法into_io(),让您获得一个实现AsyncRead / AsyncWrite(功能tokio_io之后的tokio版本)的包装器。 [WsEvent]:对于事件,可用pharos观察[WsMeta](主要用于关闭连接)。 注意:此cr
3.5.1 访问不存在的端口 3.5.2 异常终止连接 3.5.3 处理半打开连接 3.6 TCP交互数据流 3.7 TCP成块数据流 3.8 带外数据 3.9 TCP超时重传 3.10 拥塞控制 3.10.1 拥塞控制概述 3.10.2 慢启动和拥塞避免 ...
这是的后端包装。 它基本上是通过套接字与应用程序对话,使用磁铁并操纵系统,从而使用户可以部分控制VLC应用程序。 产品特点 将磁铁流到VLC 从opensubtitles API根据给定的语言自动下载最佳字幕 关闭VLC窗口后清除...
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的...
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)...
实例021 重定向输出流实现程序日志 31 实例022 自动类型转换与强制类型转换 33 2.2 运算符 34 实例023 加密可以这样简单(位运算) 34 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例...