为了说明 io流中的装饰者模式对理解io流的重要性,我想先简要介绍以下io的装饰模式。

 

  装饰(decorator)你也可以翻译成修饰。比如:一个会精通化学数学的物理学家。在这个"物理学家"前面有两个修饰语分别是化学和数学。这两个修饰语就相当于把物理学家这个人让他又有了两项本领(功能)也就是会数学和化学。同样的装饰模式也就是不断给concrete Component增加修饰语,以扩展它自身的功能。

  装饰模式简介:

  Decorator Pattern的四大角色:
1.Component (抽象构件 一般是一个接口)【在io中就是Inputstream Outputstream Reader Writer】
2.ConcreteComponent(具体构件,要实现Component接口)【在io流中也就是Component的接口的子类减去Decoratoar本身及其子类】
3.Decorator(抽象装饰,一般是一个具体类,因为他有抽象的功能在里面,所有叫抽象装饰,要实现Component接口)[在io中就是FilterInputStream FilterOutputStream FilterReader ]不包括FilterWriter因为这个抽象类,没有任何子类。
4.ConcreteDecorator(具体装饰) 【在io中也就是上述所述Decorator的子类】
编程步骤:
1.写一个接口:Component
2.写一个类ConcreteComponent实现Component
3.写一个类Decorator实现Component
4.写一个ConcretDecorator实现Component
5.在实际中这个ConcreteDecorator一般最少写三个即Decorator1  Decorator2   Decorator3  他们之间是继承关系。
代码如下:
1.Component :

public interface Component {
void operation();
}
2.ConcreteComponent:

ublic class ConcreteComponent implements Component {
 
@Override
public void operation() {
// TODO Auto-generated method stub
 
}
 

}
3.Decorator:

 
public class Decorator implements Component {
public  Component component;
 
public Decorator(Component component) {
this.component = component;
}
public Decorator() {
// TODO Auto-generated constructor stub
}
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("I can do everything");
}
 

}
4.ConcreteDecorator :Fish

public class Fish extends Decorator {
public Fish(){
 
}
public Fish(Component component){
this.component=component;
}
@Override
public void operation() {
// TODO Auto-generated method stub
super.operation();
System.out.println("fish can swim in the water ");
}
 
}
5.ConcreteDecorator : Bird

public class Bird extends Fish {
public Bird(){
 
}
public Bird(Component component){
this.component=component;
}
@Override
public void operation() {
// TODO Auto-generated method stub
super.operation();
System.out.println("virtue people like bird ,the can overview all the landscape ");
 
}
 
}
6.ConcreteDecorator Snipe

public class Snipe extends Bird {
public Snipe() {
// TODO Auto-generated constructor stub
}
public Snipe(Component component){
this.component=component;
}
@Override
public void operation() {
// TODO Auto-generated method stub
super.operation();
System.out.println("Snipe is very cuddly and shewd animal");
}
 
}

7.Test 测试类:

public class Test {
 
public static void main(String[] args) {
// TODO Auto-generated method stub
Fish fish=new Fish(new ConcreteComponent());
Bird bird=new Bird(fish);
new Snipe(bird).operation();
}
 

}

8.上述代码的输出结果为:

I can do everything
fish can swim in the water 
virtue people like bird ,the can overview all the landscape 
Snipe is very cuddly and shewd animal

而在io中设计者正式充分用了这个装饰模式对concreteComponent进行不断扩充的。

例如几个最常见的装饰:
E:\\Test.java表示一个路径
1.读取写入文件的装饰:BufferedReader in=newBufferedReader(new FileReader("E:\\Test.java"));  BufferedWriter out=new BufferedWriter(new FileWriter("E:\\Test.java"))
2.给读取写入的文件前加上编号:只需给1中的前面在加上一个修饰即:LineNumberReader即可。也就是:new LineNumberReader(in)和new LineNumberReader(out);
3.读取写入压缩文件的修饰:
  写一个压缩文件的修饰如下:
//write a file E:\\Ouyangfeng.gz

FileOutputStream f=new FileOutputStream("E:\\Ouyangfeng.gz");
CheckedOutputStream csum=new CheckedOutputStream(f,new Adler32());
ZipOutputStream zip=new ZipOutputStream(csum);
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(zip));

读一个压缩文件的修饰如下:

//Read file ouyangfeng.gz
FileInputStream fi=new FileInputStream("E:\\ouyangfeng.gz");
CheckedInputStream csumi=new CheckedInputStream(fi, new Adler32());
ZipInputStream zis=new ZipInputStream(csumi);
BufferedReader in2=new BufferedReader(new InputStreamReader(zis));

.....

当然io流中的修饰远不止这些,但是我们只要知道这种装饰的思想就可以轻松的驾驭它。

下面我想把我写的压缩文件的程序分享给大家希望大家能掌握这种思想:

代码如下:

package com.qls.compression;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Enumeration;
import java.util.zip.Adler32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipCompressionTest5 {

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//把普通文本文件放入压缩文件中
FileOutputStream f=new FileOutputStream("E:\\ouyangfeng.gz");
CheckedOutputStream csum=new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos=new ZipOutputStream(csum);
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(zos));
for(int i=1;i<=4;i++){
String str="E:\\Test"+i+".java";
zos.putNextEntry(new ZipEntry(str));
String s;
BufferedReader in=new BufferedReader(new FileReader(str));
while((s=in.readLine())!=null){
out.write(s+System.getProperty("line.separator"));
// out.newLine();//实现换行。

}
in.close();
out.flush();
}
out.close();
//Read file ouyangfeng.gz
FileInputStream fi=new FileInputStream("E:\\ouyangfeng.gz");
CheckedInputStream csumi=new CheckedInputStream(fi, new Adler32());
ZipInputStream zis=new ZipInputStream(csumi);
BufferedReader in2=new BufferedReader(new InputStreamReader(zis));
/*//第一种方法
ZipEntry ze;
while( (ze=zis.getNextEntry())!= null){
System.out.println("Reading file: "+ze);
String s;
while((s=in2.readLine())!=null){
System.out.println(s);
}
int x;
while((x=in2.read())!=-1){
System.out.print((char)x);
}
}*/
//第二种方法
ZipFile zf=new ZipFile("E:\\ouyangfeng.gz");
Enumeration<ZipEntry> e = (Enumeration<ZipEntry>) zf.entries();
while(e.hasMoreElements()){
ZipEntry ze = e.nextElement();
System.out.println("reading file:"+ze);
BufferedReader br=new BufferedReader(new FileReader(ze.toString()));
String s;
while((s=br.readLine())!=null){
System.out.println(s);
}

}
}

}

 

io流中的装饰模式对理解io流的重要性的更多相关文章

  1. Stream流中的常用方法foeEach和Stream流中的常用方法filter

    延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...

  2. Java IO流详解(六)——转换流

    转换流也是一种处理流,它提供了字节流和字符流之间的转换.在Java IO流中提供了两个转换流:InputStreamReader 和 OutputStreamWriter,这两个类都属于字符流.其中I ...

  3. 深入理解Java流机制(一)

    一.前言 C语言本身没有输入输出语句,而是调用"stdio.h"库中的输入输出函数来实现.同样,C++语言本身也没有输入输出,不过有别于C语言,C++有一个面向对象的I/O流类库& ...

  4. C++的IO处理中的头文件以及类理解(2)<sstream>头文件

    C++的IO处理中的头文件以及类理解(2)<sstream>头文件 头文件<sstream>中定义的类型都继承iostream头文件中定义的类型.除了继承得来的操作,sstre ...

  5. Java中IO流中的装饰设计模式(BufferReader的原理)

    本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...

  6. (转)教你完全理解IO流里的 read(),read(byte[]),read(byte[],int off,int len)以及write

    背景:对于IO部分,总是感觉很虚,不能很好的理解其中的要义,其实仔细分析,掌握其中的规律,一切都会看起来十分的自然. 1 理解 1.1 从头总结 长期以来,java中的InputStream Outp ...

  7. java IO输入输出流中的各种字节流,字符流类

    字节流字节流主要是操作byte类型数据,也byte数组为准,主要操作类就是·字节输出流:OutputStream·字节输入流:InputStream字符流在程序中一个字符等于2个字节,那么java提供 ...

  8. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  9. IO流中SequenceInputStream类

    SequenceInputStream类: 不断的读取InputStream流对象,对于使用Enumeration对象的情况,该类将持续读取所有InputStream对象中的内容,直到到达最后一个In ...

随机推荐

  1. linux文件IO操作篇 (二) 缓冲文件

    2. 缓冲文件操作 //规模较大 实时性低的文件 //当数据长度快要超过缓冲区的范围时,或者时间周期达到时,数据才被送往指定位置 //需要使用FILE * 作为文件标识符 //stdin 标准输入 / ...

  2. ChipScope软件使用

    内容组织 1.建立工程  2.插入及配置核  2.1运行Synthesize  2.2新建cdc文件  2.3 ILA核的配置  3. Implement and generate programmi ...

  3. git的关于测试的相关的内容

    今天,我们来讲一下git的分支的一些内容,在以前的时候,我一直都以为,对于一个项目,这个时候,我们把这个项目叫做项目a项目,这个a项目有master,staging,以及我自己的分支xxx,当我想上测 ...

  4. xss挑战赛小记 0x02(prompt(1))

    0x0O 上次搜xss挑战赛的时候 还找到了一个看上去难度更高的挑战赛 今天做了一下 学到了很多新东西 这个挑战赛能够在页面成功prompt(1)就算过关了 挑战地址 http://prompt.ml ...

  5. struts2官方 中文教程 系列十三:利用通配符选择方法

    介绍 在本教程中,我们将介绍如何在struts.xml中配置action节点以达到仅使用一个action节点将几个不同的url关联到特定action类的特定方法.这样做的目的是减少struts.xml ...

  6. golang 小知识点记录

    获取url中的参数及输出到页面的几种方式 func SayHello(w http.ResponseWriter, req *http.Request) { req.Method //获取url的方法 ...

  7. 【APUE】Chapter13 Daemon Processes

    这章节内容比较紧凑,主要有5部分: 1. 守护进程的特点 2. 守护进程的构造步骤及原理. 3. 守护进程示例:系统日志守护进程服务syslogd的相关函数. 4. Singe-Instance 守护 ...

  8. 第一篇 Postman的初级使用之设置环境快速切换生成环境与测试环境

    POSTMAN是有谷歌的开源工具,在开发调试.测试执行过程中使用频率非常广泛,本文将记录一些postman在测试中常见的一些配置和使用方法 一.基本的页面区域 略,很简单,大家都会看,再有,学习下面的 ...

  9. JavaScript RegExp 身份证、账号密码、email正则

    什么是正则表达式 正则表达式是构成搜索模式. 在文本中搜索数据时,可以使用此搜索模式来描述正在搜索的内容. 正则表达式可以是单个字符,也可以是更复杂的模式. 正则表达式可用于执行所有类型的文本搜索和文 ...

  10. python 基础篇 10 函数进阶

    本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作⽤域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ⼀. 函数参数--动态传参 ...