io流中的装饰模式对理解io流的重要性
为了说明 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 :
2.ConcreteComponent:
}
3.Decorator:
}
4.ConcreteDecorator :Fish
5.ConcreteDecorator : Bird
6.ConcreteDecorator Snipe
7.Test 测试类:
}
8.上述代码的输出结果为:
而在io中设计者正式充分用了这个装饰模式对concreteComponent进行不断扩充的。
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流的重要性的更多相关文章
- Stream流中的常用方法foeEach和Stream流中的常用方法filter
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...
- Java IO流详解(六)——转换流
转换流也是一种处理流,它提供了字节流和字符流之间的转换.在Java IO流中提供了两个转换流:InputStreamReader 和 OutputStreamWriter,这两个类都属于字符流.其中I ...
- 深入理解Java流机制(一)
一.前言 C语言本身没有输入输出语句,而是调用"stdio.h"库中的输入输出函数来实现.同样,C++语言本身也没有输入输出,不过有别于C语言,C++有一个面向对象的I/O流类库& ...
- C++的IO处理中的头文件以及类理解(2)<sstream>头文件
C++的IO处理中的头文件以及类理解(2)<sstream>头文件 头文件<sstream>中定义的类型都继承iostream头文件中定义的类型.除了继承得来的操作,sstre ...
- Java中IO流中的装饰设计模式(BufferReader的原理)
本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...
- (转)教你完全理解IO流里的 read(),read(byte[]),read(byte[],int off,int len)以及write
背景:对于IO部分,总是感觉很虚,不能很好的理解其中的要义,其实仔细分析,掌握其中的规律,一切都会看起来十分的自然. 1 理解 1.1 从头总结 长期以来,java中的InputStream Outp ...
- java IO输入输出流中的各种字节流,字符流类
字节流字节流主要是操作byte类型数据,也byte数组为准,主要操作类就是·字节输出流:OutputStream·字节输入流:InputStream字符流在程序中一个字符等于2个字节,那么java提供 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- IO流中SequenceInputStream类
SequenceInputStream类: 不断的读取InputStream流对象,对于使用Enumeration对象的情况,该类将持续读取所有InputStream对象中的内容,直到到达最后一个In ...
随机推荐
- ctf题目writeup(7)
2019.2.10 过年休息归来,继续做题. bugku的web题,地址:https://ctf.bugku.com/challenges 1. http://123.206.87.240:8002/ ...
- VGA 时序标准
VGA 显示器扫描方式从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步:当扫描完所有的行 ...
- 雷哥带你走进Javascript
javascript复习笔记--------------------------------------------1.概念2.面向对象思想3.作用认识4.引入方式5.执行顺序 变量 1)声明方式 x ...
- 第二十五篇 hashlib模块(* *)
用于加密相关的操作,Python 3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. 加密复杂程度: SHA1 ...
- jmeter接口测试--响应结果Unicode转码成中文
jmeter接口测试-响应结果Unicode转码成中文 一般情况下,接口返回数据都会经过加密,所以有时相应结果会显示为Unicode,因此,需添加BeanShell PostProcessor,加入代 ...
- 输出1-n的全排(递归C++)
[问题描述] 输出1到n之间所有不重复的排列,即1到n的全排,要求所产生的任一数列不含有重复的数字. [代码展示] #include<iostream>using namespace st ...
- 九度OJ--1163(C++)
#include <iostream>#include <vector> using namespace std; int main() { int n; while(cin& ...
- 教你如何用Docker快速搭建深度学习环境
本教程搭建集 Tensorflow.Keras.Coffe.PyTorch 等深度学习框架于一身的环境,及jupyter. 本教程使用nvidia-docker启动实例,通过本教程可以从一个全新的Ub ...
- SpringBoot 中使用shiro注解使之生效
在shiroConfig配置类中增加如下代码: /** * 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro ...
- winform 不同语言(中文,英文等)
Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.注意黑体处为关键点.一. 窗体本地化 对于Windows 窗体,你需要做的第 ...