- 浏览: 32778 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 3751. jConsole JConsole是一 ... -
常用数据库连接池
2016-03-04 16:07 483dbcp - DBCP(DataBase conn ... -
bit与字节Byte的区别和联系
2015-01-23 14:40 972bit中文名称是位,音译“比特”,是用以描述电脑数据量的最 ... -
tomcat70源码导入Eclipse
2014-12-28 01:37 582最近想研究一下tomcat的源码,费了好些劲才将其顺利导入 ... -
配置使用连接池的httpClient
2014-11-27 19:51 3308httpClient4.3开始弃用了DefaultHttp ... -
RestTemplate用法
2016-03-02 16:26 640RestTemplate 这篇文章 ... -
java序列化java.io.Externalizable(转)
2014-05-22 08:00 614这次我们讲的是控制对象的序列化和反序列化 控制序列化就是 ... -
为什么hashcode要使用31这个数
2014-05-21 15:11 737散列计算就是计算元素应该放在数组的哪个元素里。准确的说是放到哪 ... -
spring Aop 事务控制
2014-04-04 19:37 668做开发几年了,一直也没搞清楚spring的事务传播性怎么回事, ... -
java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloa
2014-03-17 17:08 570重装系统后原来项目中的单元测试跑不了,报错Caused by: ... -
java处理大txt
2012-12-11 17:37 1000java 读取txt,java读取大文件 packa ... -
Class和ClassLoader的 getResource方法的区别
2012-11-14 15:48 905比如一个类A的包声明 为 p1.p2.p3 那么我们在调用 A ... -
安装jdk7,用java -version查看确是jkd1.4.x
2012-10-26 09:30 859新做的系统,发现eclipse启不来了,jdk没有安装,然后在 ...
相关推荐
### JAVA IO流概念及其应用详解 #### 一、JAVA为何引入流的概念? 在JAVA中,引入流的概念主要是为了实现对各种类型数据的高效处理。在实际应用中,无论是从网络中传输数据还是从本地文件中读取数据,亦或是与用户...
同时,Java 7引入的try-with-resources语句可以更好地管理IO流的关闭,防止资源泄漏。 总的来说,理解Java的IO系统,特别是字节流和字符流的概念,对于开发高效、可靠的程序至关重要。通过选择合适的流类型、使用...
- 功能差异:节点流直接连接到数据源或目的地,如`FileInputStream`,而处理流不直接连接,它们是其他流的包装,如`BufferedInputStream`,用于提高性能。 5. 节点流与处理流的关系:节点流位于IO操作的第一线,...
Java IO流的使用涉及到流的打开、数据的读写操作和流的关闭。正确地使用流可以避免内存泄漏和其他资源问题。在实际开发中,通常会结合try-catch-finally语句来确保即使发生异常也能正确关闭流。 总结来说,Java IO...
这类流被称为“包装流”,如`BufferedInputStream`, `BufferedReader`等。 #### 七、Java中的IO流体系结构 Java的IO流体系主要包括以下几种流: - **FileInputStream/FileOutputStream**:节点流,用于以字节为...
Java中的IO流是Java核心库java.io中的关键组成部分,它为程序提供了与外部资源交互的能力,包括文件读写、标准设备输入输出等。Java的IO流机制基于流的概念,流可以被视为数据传输的通道,数据按照序列化的方式从...
示例代码中展示了一个读取和写入文件的标准流程:首先创建对应的流对象,然后进行读写操作,最后关闭流以释放资源。如读取文件时,通过循环调用`read()`方法,将数据读入到字节数组或字符数组中;写入文件时,将数据...
节点流是最基本的流类型,处理流是节点流的包装类,提供了更多的功能。 二、IO 流的四大抽象类 Java 中的 IO 流有四大抽象类:InputStream、OutputStream、Reader 和 Writer。这四个抽象类是所有 IO 流的基类,...
- **按处理效率**:分为节点流(低级流)和包装流(高级流)。 - 节点流:直接与设备交互,效率较低。 - 包装流:对节点流进行封装,提高读写效率,例如缓冲流。 #### 二、InputStream/OutputStream - **...
Java IO流和Socket是Java编程语言中用于处理输入输出和网络通信的重要概念。在这个示例中,我们将深入探讨如何利用Java IO流与Socket实现简单的文本传输。对于初学者来说,理解这两个概念及其交互是非常关键的。 ...
3. `Stream` 类是所有流的基础抽象类,提供了对字节流的通用操作,如读写、定位和关闭流。 4. `FileStream` 是基于文件的 `Stream` 实现,支持同步和异步读写操作。 5. `MemoryStream` 用于在内存中创建流,通常用于...
最后,别忘了关闭流的重要性。每当完成I/O操作后,都应调用close()方法释放资源,防止资源泄露。 总的来说,Java I/O流是一个复杂而强大的系统,它涵盖了数据的读取、写入、转换、缓冲、多线程通信等多个方面。通过...
3. **按功能与应用对象划分**:包括节点流(直接连接到数据源/目的地)和处理流(对已有流进行包装,增加额外功能)。 **三、InputStream与OutputStream** InputStream代表所有字节输入流的抽象基类,其read()方法...
在实际应用中,通常会使用缓冲流来包装基础的字节流,如`FileInputStream`和`FileOutputStream`,以提高性能。 4. **第三方库Apache Commons IO**:在`FileCopyByCommonsTest()`方法中,使用了Apache Commons IO库...
- 处理流(Filter Stream):也叫包装流,不直接与数据源或目的地关联,而是包裹在节点流之上,提供额外的功能,如BufferedInputStream。 三、Java IO流的常用类 1. FileInputStream和FileOutputStream:用于文件...
### Java IO流详细分析 #### 一、Java IO流概述 在Java中,输入/输出(Input/Output,简称IO)操作是程序与外部设备进行数据交换的重要方式。Java提供了丰富的API来支持各种类型的IO操作,包括文件读写、网络通信...
3. 按照处理对象的不同,流可以分为节点流和处理流(或包装流)。节点流直接与数据源或目的地相连,如`FileInputStream`。处理流不直接操作数据源,而是用来包装其他流,提供额外的功能,如缓冲、格式转换等,例如`...
Java语言在处理输入输出操作时,使用了IO流(Input/Output Stream)技术,这是Java标准库中的核心功能之一。本教程《黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件)》专注于讲解如何利用IO流来...
Java IO提供了过滤流(Filter Stream),可以对已有流进行包装,添加额外的功能或修改其行为,例如: - FilterInputStream 和 FilterOutputStream 用于包装字节流,可以添加缓冲、压缩等功能。 - FilterReader 和...
8. 滤流器流:FilterInputStream和FilterOutputStream是所有包装流的基类,如DataInputStream和DataOutputStream可以添加额外的功能,如读写基本数据类型。 9. 标准流:System.in、System.out和System.err代表标准...