Java I/O库的设计原则
Java语言的I/O库是对各种常见的流源,流汇以及处理过程的抽象化。客户端的Java程序不必知道最终的流源,流汇是磁盘上的文件还是数组等;也不必关心数据是否经过缓冲的,可否按照行号读取等处理的细节。
书中提到了,对于第一次见到Java/IO库的人,无不因为这个库的庞杂而感到困惑;而对于熟悉这个库的人,而又常常为这个库的设计是否得当而争论不体。书的作者提出自己的意见,要理解Java I/O这个庞大而复杂的库,关键是要掌握两个对称性跟两个设计模式模式。
Java I/O库具有两个对称性,它们分别是:
1 输入-输出对称性,比如InputStream和OutputStream各自占据Byte流的输入与输出的两个平行的等级结构的根部。而Reader和Writer各自占据Char流的输入与输出的两个平行的等级结构的根部。
2 byte-char对称,InputStream和Reader的子类分别负责Byte和Char流的输入;OutputStream和Writer的子类分别负责Byte和Char流的输出,它们分别形成平行的等级结构。
Java I/O库的两个设计模式:
Java的I/O库总体设计是符合装饰者模式(Decorator)跟适配器模式(Adapter)的。如前所述,这个库中处理流的类叫做流类。引子里所谈到的FileInputStream,FileOutputStream,DataInputStream及DataOutputStream都是流处理器的例子。
1 装饰者模式:在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。装饰者模式是Java I/O库的整体设计模式。这样的一个原则是符合装饰者模式的,如下图所示:
2 适配器模式:在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用,如下图所示。
适配器模式应用到了原始流处理器的设计上面,构成了I/O库所有流处理器的起点。
JDK为程序员提供了大量的类库,而为了保持类库的可重用性,可扩展性和灵活性,其中使用到了大量的设计模式,本文将介绍JDK的I/O包中使用到的Decorator模式,并运用此模式,实现一个新的输出流类。
Decorator模式简介
Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责。与生成子类相比,它更具有灵活性。
有时候,我们需要为一个对象而不是整个类添加一些新的功能,比如,给一个文本区添加一个滚动条的功能。我们可以使用继承机制来实现这一功能,但是这种方法不够灵活,我们无法控制文本区加滚动条的方式和时机。而且当文本区需要添加更多的功能时,比如边框等,需要创建新的类,而当需要组合使用这些功能时无疑将会引起类的爆炸。
我们可以使用一种更为灵活的方法,就是把文本区嵌入到滚动条中。而这个滚动条的类就相当于对文本区的一个装饰。这个装饰(滚动条)必须与被装饰的组件(文本区)继承自同一个接口,这样,用户就不必关心装饰的实现,因为这对他们来说是透明的。装饰会将用户的请求转发给相应的组件(即调用相关的方法),并可能在转发的前后做一些额外的动作(如添加滚动条)。通过这种方法,我们可以根据组合对文本区嵌套不同的装饰,从而添加任意多的功能。这种动态的对对象添加功能的方法不会引起类的爆炸,也具有了更多的灵活性。
以上的方法就是Decorator模式,它通过给对象添加装饰来动态的添加新的功能。如下是Decorator模式的UML图:
Component为组件和装饰的公共父类,它定义了子类必须实现的方法。
ConcreteComponent是一个具体的组件类,可以通过给它添加装饰来增加新的功能。
Decorator是所有装饰的公共父类,它定义了所有装饰必须实现的方法,同时,它还保存了一个对于Component的引用,以便将用户的请求转发给Component,并可能在转发请求前后执行一些附加的动作。
ConcreteDecoratorA和ConcreteDecoratorB是具体的装饰,可以使用它们来装饰具体的Component.
Java IO教程 如果您对Decorator模式非常了解,就能轻易地看出Java的IO类结构:
根接口是InputStream/OutputStream,
充当数据源的IO类有ByteArrayInputStream/ByteArrayOutputStream,FileInputStream/FileOutputStream,PipedInputStream/PipedOutputStream等,
充当装饰功能的IO类有BufferedInputStream/BufferedOutputStream,DataInputStream/DataOutputStream,LineNumberInputStream,PushbackInputStream等,它们都是继承装饰接口FilterInputStream/FilterOutputStream。
使用IO时,首先创建一个数据源IO,然后根据需要的功能创建装饰类IO,其构造函数的参数为已创建的数据源IO。
从Decorator,Adapter模式看Java/IO库(一)
http://www.360doc.com/content/08/0902/22/63912_1604180.shtml
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
有应聘"Java/Golang,工程师/架构师", 请发邮件至: linzuxiong1988@gmail.com, 并取得联系.
工程师招聘,岗位见:
http://job.youzan.com 请联系我: linzuxiong1988@gmail.com
分享到:
相关推荐
Java IO框架 commons-io-2.11.0
包含翻译后的API文档:commons-io-2.7-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-io:commons-io:2.7; 标签:commons、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index....
commons-io-2.6--java框架技术
javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...
Java IO 体系 - Java IO 体系 ...Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO
Java 文件IO-Stream-File 教程 Java 流(Stream)、文件(File)和 IOJava.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、...
Java_JDK6之IO详解 一个程序员最基础的东西
java文件io流编程 java网络编程 java多线程编程 java ee基础1 java面向对象编程--数据库编程-->java se java 基础2 html--css--javascript-->div+css java ee中级部分 Servlet--Jsp-->mvc模式 java ee高级部分 ...
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》java.io
jai_imageio-1_1-lib-linux-amd64-jdk.bin jai_imageio-1_1-lib-linux-amd64-jre.bin jai_imageio-1_1-lib-linux-i586-jdk.bin jai_imageio-1_1-lib-linux-i586-jre.bin jai-1_1_3-lib-linux-amd64-jdk.bin jai...
java的jdk源码解析,主要解析io、nio相关的类组织结构图
前一段时间学习多线程,狂神老师说需要用到里面的jar包进行资源下载的练习。找了好久才找到了这个官方的jar包合集,在这里免费的送给各位老铁们,希望大家一起努力学习,在秃头的道路上一往无前。
commons-files1.3和2commons-io2.2适用于jdk1.6 实现视频上传功能时亲测可以运行
graalvm jdk 17 社区版22.3.1配套的镜像windows amd64文件,参考官方的安装部署教程安装 自行安装Build Tools,编译时需要Command Prompt下才能编译。 安装命令: 进入到这个jar根目录下 gu install -L native-...
collection Java 源码 概述 主要分析 JDK8 源码。 基础 java-io java-nio java-reflect java-collection java-annotation java-net java-jdbc java-concurrent java-jvm java8
commons-io所有版本(0.1-2.4).zip
Commons IO 2.4 (需要 JDK 1.6+) 内含 commons-io-2.4-bin.zip commons-io-2.4-src.zip Commons IO 2.2 (需要 JDK 1.5+) 内含 commons-io-2.2-bin.zip commons-io-2.2-src.zip
包含翻译后的API文档:minio-8.0.3-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:io.minio:minio:8.0.3; 标签:minio、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...
亚马逊sp-api 亚马逊sp api java sdk背景: 亚马逊(amazon)在2020年10月推出了新的替代mws的api方案,称为Selling Partner API(SP-API)。sp-api在修改原mws的接口方式的基础上引入了aws的IAM权限管理,增加了开发者...
commons-io-2.4 包含了所有commons-io的jar包和源码 适用于jdk1.6以上的版本。