您的位置:首页 > 编程语言 > Java开发

java.io实现分析

2011-03-14 00:59 323 查看
今天写了个读取excel文件的程序,因为需要将数据写入txt中以备后用,所以又涉及到java.io的使用。Java.io 是个很繁杂的库(初看=、=),有N多个杂七杂八的InputStream,OutputStream之类的东西。。。。
想弄清楚,我们先理一下其层次结构::(这个出自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的实现类似呐,没错了,装饰模式就是要为已有功能添加更多功能,正如在煮汤,在我们有红枣,冰糖时,我们扩展原来的功能为其增加添加红枣的功能...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: