我不知道各位是师弟师妹们学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 装饰类新说相关推荐

  1. Java全栈(二)JavaSE:25.File类和IO流

    1 java.io.File类 1.1 概述 File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名 ...

  2. java io 装饰者_Java IO 装饰者模式

    装饰模式(Decorator) 装饰模式又名包装(Wrapper)模式. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的 ...

  3. Java基础巩固(二)异常,多线程,线程池,IO流,Properties集合,IO工具类,字符流,对象流,Stream,Lambda表达式

    一.异常,多线程 学习目标 : 异常的概述 异常的分类 异常的处理方式 自定义异常 多线程入门 1 异常的概述 1.1 什么是异常? 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程 ...

  4. JAVA File类、IO流体验与简介(字节流、字符流、序列流、打印流、编码、递归)

    1. File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动 ...

  5. Java学习总结:48(System类对IO的支持)

    System类对IO的支持 System类与IO有关的3个对象常量 No. 常量 类型 描述 1 public static final PrintStream err 常量 显示器上错误显示 2 p ...

  6. Java知识点总结(JavaIO- System类对IO的支持与Scanner类 )

    Java知识点总结(JavaIO- System类对IO的支持与Scanner类 ) @(Java知识点总结)[Java, JavaIO] [toc] System类 public class Dem ...

  7. java按照io流向基类_Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的实现数据的输入和输出操作.在java中把不同的输入/输出源(键盘,文件,网络连接等)抽 ...

  8. Java的IO操作(五) - PrintStream类、字符流、Reader和Writer、带缓冲的字符流BufferedReader和BufferedWriter...

    1. PrintStream类 我们都知道,int类型在Java中占4个字节,如1在内存中表示为 00000000 00000000 00000000 00000001.如果我们直接使用OutputS ...

  9. Java文件类– java.io.File

    Java File class is at the center of Java IO operations. Java File类是Java IO操作的中心. Java文件类 (Java File ...

  10. Java基础:File类与IO流

    1. File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.2 构造方法 public File(String path ...

最新文章

  1. 重磅:腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
  2. js 的try catch应用
  3. 5.5 function
  4. Linux学习之系统编程篇:shm 共享内存及其操作函数
  5. 【渝粤题库】广东开放大学 统计基础 形成性考核
  6. 测试常用工具下载地址,LR11、QC11
  7. Oracle On Linux
  8. OCR技术系列实践:银行卡、身份证、门牌号、护照、车牌、印刷体汉字识别
  9. Swift - 控制流/控制结构说明(if,switch,for,while)
  10. 痴情研究java内存中的对象
  11. 4. Firebug 调试 Js
  12. win10音响左右声道测试软件,win10左右声道不分的三种解决方法【图文】
  13. 电力系统的常用仿真模块MATLAB/SIMULINK(1)
  14. echarts 鼠标弹框显示百分比柱状图显示百分比
  15. 泰坦尼克号生存预测python毕设_机器学习入门案例分析-泰坦尼克号生存预测
  16. m3u8视频格式转换
  17. 宏和js实现word内容替换
  18. 关于程序员的20 幅幽默漫画,太真实了!
  19. 国产骨传导耳机推荐,目前最好用的几款骨传导耳机
  20. win10 计算机 搜索文件,在 Windows 10 上高效搜文件,自带搜索功能其实就够了

热门文章

  1. linux程序文本,Linux之文本处理
  2. matlab 2018 ccs,Matlab2018a 与ccs7生成tms320F2812代码调试记录
  3. spring连接mysql出现问题_spring+hibernate连接mysql问题啊
  4. python socket 域名_python用socket发送http请求
  5. 今天写了个商品采购入得存储过程,使用游标实现的,实现了多个商品库存的增加...
  6. 【数据结构】线段树(interval tree)
  7. DEBUG -- CLOSE BY CLIENT STACK TRACE问题的两种解决方案,整理自网络
  8. oracle 索引监控
  9. PowerDesigner模型设计1
  10. EGLSurface 和 OpenGL ES