java.io实现分析
2011-03-14 00:59
323 查看
今天写了个读取excel文件的程序,因为需要将数据写入txt中以备后用,所以又涉及到java.io的使用。Java.io 是个很繁杂的库(初看=、=),有N多个杂七杂八的InputStream,OutputStream之类的东西。。。。
想弄清楚,我们先理一下其层次结构::(这个出自Siobhan的一篇博文)
有了这个分层结构,大概可以对其各个类的关系有个感性的认识。为了更好理解java.io 我们需要了解两个经典设计模式,装饰模式和适配器模式,java.io的实现就是这两模式的典型应用。
首先来看看装饰模式:
Component是定义一个对象接口,可以给这些对象动态地加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator, 装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
以FileOutputStream和BufferedOutputStream为例,
BufferedOutputStream bufferOut = new BufferedOutputStream(new FileOutputStream(new File("。。。")));
我们通常以这样的方式来实现一个到文件的缓冲输出流,看看bufferedOutputStream中write的实现。
可以看到out.write(b, off, len);这一句是调用初始化中对象的write,在这里也就是FileOutputStream的write,而在调用其write之前,bufferedOutputStream还对缓冲区进行处理以实现数据流的缓冲功能。这就是典型的装饰模型。
今晚主席想要煮花生汤,宿舍原料有限,也就只能放点花生,白糖啥的!! 呃!还有水(⊙o⊙)。条件有的话应该加点冰糖,红枣神马的才对。 那么让我们来编程实现原料放置吧!自动化嘛!这里我们假设有不同的放置顺序,并且美味程度还不一样=。=
好了,开始吧!
具体的类实现如下:
是不是觉得跟上面bufferedOutputStream的实现类似呐,没错了,装饰模式就是要为已有功能添加更多功能,正如在煮汤,在我们有红枣,冰糖时,我们扩展原来的功能为其增加添加红枣的功能...
想弄清楚,我们先理一下其层次结构::(这个出自Siobhan的一篇博文)
java.lang.Object • java.io.File (implements java.lang.Comparable <T>, java.io.Serializable ) • java.io.FileDescriptor • java.io.InputStream (implements java.io.Closeable ) • java.io.ByteArrayInputStream • java.io.FileInputStream • java.io.FilterInputStream • java.io.BufferedInputStream • java.io.DataInputStream (implements java.io.DataInput ) • java.io.LineNumberInputStream • java.io.PushbackInputStream • java.io.ObjectInputStream (implements java.io.ObjectInput , java.io.ObjectStreamConstants ) • java.io.PipedInputStream • java.io.SequenceInputStream • java.io.StringBufferInputStream java.io.ObjectInputStream.GetField java.io.ObjectOutputStream.PutField java.io.ObjectStreamClass (implements java.io.Serializable ) java.io.ObjectStreamField (implements java.lang.Comparable <T>) java.io.OutputStream (implements java.io.Closeable , java.io.Flushable ) • java.io.ByteArrayOutputStream • java.io.FileOutputStream • java.io.FilterOutputStream • java.io.BufferedOutputStream • java.io.DataOutputStream (implements java.io.DataOutput ) • java.io.PrintStream (implements java.lang.Appendable , java.io.Closeable ) • java.io.ObjectOutputStream (implements java.io.ObjectOutput , java.io.ObjectStreamConstants ) • java.io.PipedOutputStream java.security.Permission (implements java.security.Guard , java.io.Serializable ) • java.security.BasicPermission (implements java.io.Serializable ) • java.io.SerializablePermission • java.io.FilePermission (implements java.io.Serializable ) java.io.RandomAccessFile (implements java.io.Closeable , java.io.DataInput , java.io.DataOutput ) java.io.Reader (implements java.io.Closeable , java.lang.Readable ) • java.io.BufferedReader • java.io.LineNumberReader • java.io.CharArrayReader • java.io.FilterReader • java.io.PushbackReader • java.io.InputStreamReader • java.io.FileReader • java.io.PipedReader • java.io.StringReader java.io.StreamTokenizer java.lang.Throwable (implements java.io.Serializable ) • java.lang.Exception • java.io.IOException • java.io.CharConversionException • java.io.EOFException • java.io.FileNotFoundException • java.io.InterruptedIOException • java.io.ObjectStreamException • java.io.InvalidClassException • java.io.InvalidObjectException • java.io.NotActiveException • java.io.NotSerializableException • java.io.OptionalDataException • java.io.StreamCorruptedException • java.io.WriteAbortedException • java.io.SyncFailedException • java.io.UnsupportedEncodingException • java.io.UTFDataFormatException java.io.Writer (implements java.lang.Appendable , java.io.Closeable , java.io.Flushable ) • java.io.BufferedWriter • java.io.CharArrayWriter • java.io.FilterWriter • java.io.OutputStreamWriter • java.io.FileWriter • java.io.PipedWriter • java.io.PrintWriter • java.io.StringWriter
有了这个分层结构,大概可以对其各个类的关系有个感性的认识。为了更好理解java.io 我们需要了解两个经典设计模式,装饰模式和适配器模式,java.io的实现就是这两模式的典型应用。
首先来看看装饰模式:
Component是定义一个对象接口,可以给这些对象动态地加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator, 装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
以FileOutputStream和BufferedOutputStream为例,
BufferedOutputStream bufferOut = new BufferedOutputStream(new FileOutputStream(new File("。。。")));
我们通常以这样的方式来实现一个到文件的缓冲输出流,看看bufferedOutputStream中write的实现。
public synchronized void write(byte b[], int off, int len) throws IOException { if (len >= buf.length) { /* If the request length exceeds the size of the output buffer, flush the output buffer and then write the data directly. In this way buffered streams will cascade harmlessly. */ flushBuffer(); out.write(b, off, len); return; } if (len > buf.length - count) { flushBuffer(); } System.arraycopy(b, off, buf, count, len); count += len; }
可以看到out.write(b, off, len);这一句是调用初始化中对象的write,在这里也就是FileOutputStream的write,而在调用其write之前,bufferedOutputStream还对缓冲区进行处理以实现数据流的缓冲功能。这就是典型的装饰模型。
今晚主席想要煮花生汤,宿舍原料有限,也就只能放点花生,白糖啥的!! 呃!还有水(⊙o⊙)。条件有的话应该加点冰糖,红枣神马的才对。 那么让我们来编程实现原料放置吧!自动化嘛!这里我们假设有不同的放置顺序,并且美味程度还不一样=。=
好了,开始吧!
具体的类实现如下:
public class Tang { public Tang(){ } public void ZhuTang(){ System.out.println("煮汤"); } } public class YuanLiao extends Tang{ protected Tang component; public void decorate(Tang component){ this.component = component; } public void ZhuTang(){ if(component != null){ component.ZhuTang(); } } } public class HuaSheng extends YuanLiao { public void ZhuTang(){ System.out.println("放花生"); component.ZhuTang(); } } public class HongZao extends YuanLiao { public void ZhuTang(){ System.out.println("放红枣"); component.ZhuTang(); } } public class BingTang extends YuanLiao { public void ZhuTang(){ System.out.println("放冰糖"); component.ZhuTang(); } } public class Test { /** * @param args */ public static void main(String[] args) { //创建汤(Tang)实例 Tang tang = new Tang(); System.out.println("第一种放置方法:"); HuaSheng huasheng = new HuaSheng(); BingTang bingtang = new BingTang(); bingtang.decorate(tang); huasheng.decorate(bingtang); huasheng.ZhuTang(); System.out.println("第二种放置方法:"); HongZao hongzao = new HongZao(); bingtang.decorate(tang); hongzao.decorate(bingtang); huasheng.decorate(hongzao); huasheng.ZhuTang(); } }
是不是觉得跟上面bufferedOutputStream的实现类似呐,没错了,装饰模式就是要为已有功能添加更多功能,正如在煮汤,在我们有红枣,冰糖时,我们扩展原来的功能为其增加添加红枣的功能...
相关文章推荐
- Johnson-Trotter算法的分析和java实现
- HTTP POST请求报文格式分析与Java实现文件上传
- 深入分析 java IO的工作机制
- java NIO原理 图文分析及代码实现
- java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)
- [Java算法分析与设计]顺序循环队列的实现
- Java NIO原理 图文分析及代码实现
- 各种排序算法的分析及java实现
- java io源码分析
- [学习笔记]Java文件IO操作------实现对文件的读取与写入
- Java Timer 定时任务实现原理及缺陷分析
- 【并发】死磕Java并发:深入分析synchronized的实现原理
- JAVA实现一个简单的代数运算语言编译器(二)--词法分析准备
- 【Java 并发系列】深入分析Volatile的实现原理
- 关于用java io实现文件压缩与解压(不涉及压缩算法)
- 各种排序算法的分析及java实现
- 各种排序算法的分析及java实现
- JAVA实现简单系统登陆注册模块的设计(附详细代码分析)
- Java中ArrayList具体实现分析1
- 各种排序算法的分析及java实现