java io装饰类,Java IO 装饰类新说
我不知道各位是师弟师妹们学java时是怎样的,就我的刚学java时的感觉,java.io包是最让我感到一头雾水的。所以现在这篇文,尽可能简单地描述java.io包的结构,希望对java.io同样一头雾水的师弟师妹们有些帮助^_^
我开始学java时,java.io的介绍是在《java编程思想》里看的。说实话,当时完全看不明白——“java.io的是用‘decorator模式’来构建的”——刚学java时,天知道啥玩意叫decorator……
不过要明白java.io,确实需要理解decorator设计模式,下面详细介绍下。
所谓decorator,装饰,其实可以说是一种设计的技巧,说白了没什么难的,别看很多网上资料说的天花乱坠的(非常讨厌有些文章总是把简单的问题描述得跟两头猪的kiss问题一样复杂……)。
decorator的结构如下:
MyInterface
|
_______|_______
| |
Myclass Decorator
____|_____
| |
DecoratorA DecoratorB
decorator的目的是在不改变任何原有的类的基础下,添加新的功能(你可以理解为书上说的灵活性)。其中Myclass是你要扩展的类,DecoratorA跟DecoratorB封装了你要扩展的功能,并保存有一个MyInterface的引用。
考虑以下代码:
public static void main(Strings[] arg){
myInterface a = new myClass();
a.print();
}
myInterface 是myClass的接口,只声明了一个方法print(),myClass实现了该方法:
public void print(){
System.out.println("hello");
}
那么假如我们要在不改变原来的myClass的基础上,变成输出“hello world!”,要怎么做呢?
当然我们可以考虑直接写个myClass的子类,helloClass之类,但是要是要求根据环境不同,输出"hello world!",my hello world","my Hello"之类的组合呢?
用继承的方式将不得不写一堆类似的子类来。
decorator,装饰模式的解决方法是,只实现基本的功能,把附加的功能抽出来放一边。
例如以下代码:
class DecoratorA implements Decorator{
MyInterface myObject;
DecoratorA(myInterface myObject){
this.myObject = myObject;
}
public void print(){
myObject.print();
System.out.print("world!");
}
}
class DecoratorB implements Decorator{
MyInterface myObject;
DecoratorA(myInterface myObject){
this.myObject = myObject;
}
public void print(){
System.out.print("my");
myObject.print();
}
}
DecoratorA和DecoratorB的功能分别是打印出world跟my。这时main函数要打印出my hello world可简单变为:
public static void main(Strings[] arg){
MyInterface a =new DecoratorA(new DecoratorB(new MyClass());
a.print();
}
简单吧?简单的说,就是:
print(){
print("xxx");//可替换成你要添加的任何处理;
myObject.print();//调用基础类的函数;
xxxx; //后续处理
}
Decorator的介绍就到此为止,接下来讲java.io.
看到
MyInterface a =new DecoratorA(new DecoratorB(new MyClass());
是不是觉得眼熟咧?这跟
BufferedInputStream bis = new BufferedInputStream(new DataInpuStream(new FileInputStream("xxx.txt")));
是不是很像?
(画外音加一个臭鸡蛋扔上来:因为java.io就是用decorator模式组织的,当然像啦……)
java.io分Stream跟reader、writer两大类,这里只详细介绍Stream,并最后两者间的关系。Stream又分inputStream、OutputStream,两者基本是对称的,这里也只介绍InputStream.
java.io.InputStream
|
_______________________|________________________
| |
ByteArrayInputStream FilterInputStream
StringBufferInputStream _____________________|____________________________
FileInputStream | | | |
PipedInputStream DataInputStream BufferedInputStream LineNumInpuStream XXX
(注:xxx是PushbackInputStream,上面的图放不下)
这个图跟最初介绍的hello world的图很像吧?呵呵。
基础的流只有左边4个,这些流代表了数据的来源,所有的流都必须从这四个中之一开始。(注,还有一个RandomAccessFile、File,这两个不在本文介绍范围)。
然后当我们需要什么添加功能,就从右边中选择一个装饰。例如,我们需要缓存功能,那么需要bufferedInputStream装饰:
BufferdInputStream is = new BufferedInputStream(new FileInputStream("xxx.txt"));
假如再要DataInputStream的功能,只要在加一层:
DataInputStream dis = new DataInputStream(new BufferdInputStream(new FileInputStream));
(厄,我不甚明白这个类添加的功能是做什么用的,资料说是增加读取java原生数据的功能,不甚明白,有清楚的来补充一下,pipeInputStream跟sequenceInputStream也没用过,欢迎补充说明)
这里你可以想象成,在基本的FileInputStream.readxxx()方法在BufferedInputStream的readxxx()方法调用,并添加相应的处理。
最后说说InputStream跟reader的区别:
老实说,我只知道一个支持字节流,一个支持unicode流,除此之外有啥米性能上的不同我还真不知道,哈哈。知道的快来补充补充~
java io装饰类,Java IO 装饰类新说相关推荐
- Java全栈(二)JavaSE:25.File类和IO流
1 java.io.File类 1.1 概述 File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名 ...
- java io 装饰者_Java IO 装饰者模式
装饰模式(Decorator) 装饰模式又名包装(Wrapper)模式. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的 ...
- Java基础巩固(二)异常,多线程,线程池,IO流,Properties集合,IO工具类,字符流,对象流,Stream,Lambda表达式
一.异常,多线程 学习目标 : 异常的概述 异常的分类 异常的处理方式 自定义异常 多线程入门 1 异常的概述 1.1 什么是异常? 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程 ...
- JAVA File类、IO流体验与简介(字节流、字符流、序列流、打印流、编码、递归)
1. File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动 ...
- Java学习总结:48(System类对IO的支持)
System类对IO的支持 System类与IO有关的3个对象常量 No. 常量 类型 描述 1 public static final PrintStream err 常量 显示器上错误显示 2 p ...
- Java知识点总结(JavaIO- System类对IO的支持与Scanner类 )
Java知识点总结(JavaIO- System类对IO的支持与Scanner类 ) @(Java知识点总结)[Java, JavaIO] [toc] System类 public class Dem ...
- java按照io流向基类_Java IO详解
1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的实现数据的输入和输出操作.在java中把不同的输入/输出源(键盘,文件,网络连接等)抽 ...
- Java的IO操作(五) - PrintStream类、字符流、Reader和Writer、带缓冲的字符流BufferedReader和BufferedWriter...
1. PrintStream类 我们都知道,int类型在Java中占4个字节,如1在内存中表示为 00000000 00000000 00000000 00000001.如果我们直接使用OutputS ...
- Java文件类– java.io.File
Java File class is at the center of Java IO operations. Java File类是Java IO操作的中心. Java文件类 (Java File ...
- Java基础:File类与IO流
1. File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.2 构造方法 public File(String path ...
最新文章
- 重磅:腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
- js 的try catch应用
- 5.5 function
- Linux学习之系统编程篇:shm 共享内存及其操作函数
- 【渝粤题库】广东开放大学 统计基础 形成性考核
- 测试常用工具下载地址,LR11、QC11
- Oracle On Linux
- OCR技术系列实践:银行卡、身份证、门牌号、护照、车牌、印刷体汉字识别
- Swift - 控制流/控制结构说明(if,switch,for,while)
- 痴情研究java内存中的对象
- 4. Firebug 调试 Js
- win10音响左右声道测试软件,win10左右声道不分的三种解决方法【图文】
- 电力系统的常用仿真模块MATLAB/SIMULINK(1)
- echarts 鼠标弹框显示百分比柱状图显示百分比
- 泰坦尼克号生存预测python毕设_机器学习入门案例分析-泰坦尼克号生存预测
- m3u8视频格式转换
- 宏和js实现word内容替换
- 关于程序员的20 幅幽默漫画,太真实了!
- 国产骨传导耳机推荐,目前最好用的几款骨传导耳机
- win10 计算机 搜索文件,在 Windows 10 上高效搜文件,自带搜索功能其实就够了
热门文章
- linux程序文本,Linux之文本处理
- matlab 2018 ccs,Matlab2018a 与ccs7生成tms320F2812代码调试记录
- spring连接mysql出现问题_spring+hibernate连接mysql问题啊
- python socket 域名_python用socket发送http请求
- 今天写了个商品采购入得存储过程,使用游标实现的,实现了多个商品库存的增加...
- 【数据结构】线段树(interval tree)
- DEBUG -- CLOSE BY CLIENT STACK TRACE问题的两种解决方案,整理自网络
- oracle 索引监控
- PowerDesigner模型设计1
- EGLSurface 和 OpenGL ES