`
- 浏览:
239766 次
- 性别:
- 来自:
上海
-
我不知道各位是师弟师妹们学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流,除此之外有啥米性能上的不同我还真不知道,哈哈。知道的快来补充补充~
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax....
代码可能使用了Java的`java.net.URL`类来处理URL,`java.io`包进行文件读写,以及可能使用了`Jsoup`库来解析HTML文档,因为`Jsoup`是Java中一个非常流行的HTML解析库,能方便地提取和操作HTML元素。 接下来,我们来...
Java入门笔记文档详细阐述了Java编程语言的基本概念、开发工具、编程基础、面向对象编程、多线程、集合框架、IO流、网络编程、安全加密、反射机制、新特性、内存管理等多个方面,为初学者提供了一条通往Java编程世界...
Java提供了一系列的File类和IO流用于文件操作,包括读取配置文件、保存用户数据等。 7. **版本控制**:项目的源代码管理可能使用了Git,这是一种分布式版本控制系统,有助于团队协作和代码版本管理。 8. **构建...
下面将详细解说其中的知识点: 1. 文件IO操作(输入输出) 实验报告中提到了文件IO操作的学习,这是Java语言中处理文件和目录的基础知识。文件IO操作包括创建、删除、重命名文件或目录。具体方法例如`File`类的`...
6. **输入/输出流**:Java的IO流系统涵盖了文件读写、网络通信等内容,书中会介绍基本的字节流和字符流,以及缓冲流、对象流和文件操作。 7. **集合框架**:Java集合框架提供了多种数据结构,如ArrayList、...
耿祥义版的Java课程设计源代码是一份非常有价值的参考资料,它由知名讲师耿祥义精心编排,涵盖了多个编程实例,每个例子都配备了详细的源代码解说,帮助学习者更好地理解和应用Java编程概念。 1. **Java基础知识**...
这个项目包含了详细的解说文档和数据库相关资料,为学员提供了一个全面理解软件开发流程的机会。 一、Java基础与进阶 在该项目中,学员将回顾并深化Java基础知识,如面向对象编程(OOP)概念,包括类、对象、封装、...
C++ IO流库教程资料 PDF,包括了一些关于IO流库的问答和解说,后面附有IO流库的基础知识介绍,其中并附有了丰富的代码实例来说明问题,若需要了解详细的C++ IO流相关知识,这个小册子还是不错的。
文档《linux创建用户、文件夹、用户组的添加和删除的命令及解说.docx》涵盖了这些基本操作,例如`useradd`、`groupadd`、`mkdir`、`rm`、`chown`、`chmod`等。 六、问题调试与优化 1. **日志查看**:通过检查...