作者:Flyingis
任何程序语言的I/O设计都是一项具有挑战的任务,因为数据的传输存在多种可能,这些可能不仅存在于数据发送端和接收端(文件、网络链接等),还存在于这些数据的多种存在方式,例如缓冲区数据、顺序存取数据、字符数据、字节数据等等。<!----><o:p></o:p>
Java的I/O使用“流”这个抽象的概念,它屏蔽了实际的I/O设备中处理数据的细节。在实际的应用中,我们很少使用单一的类来创建流对象,而是通过多个对象来提供所需要的I/O功能。Java从1.0到1.1到1.4多I/O类库作了多次重大修改,具体的可以参考相关的书籍或Sun官方网站。这里是从模式的角度来分析Java的I/O类库的设计。<o:p></o:p>
Strategy设计模式<o:p></o:p>
将会发生变化的代码封装在单独的类(Strategy对象)中,供其他保持不变的类使用,实现某种算法或应用,这是Strategy设计模式的一般思想。在Java I/O中,一个典型的应用是File类,它可以代表一个特定文件的名称,也可以代表一个目录下一组文件的名称。当我们要查询显示一个目录下特定文件类型的所有文件对象信息时,就需要将这个目录下的文件过滤,找到所需要的对象。<o:p></o:p>
import java.io.*;<o:p></o:p>
import java.util.*;<o:p></o:p>
import java.util.regex.*;<o:p></o:p>
<o:p> </o:p>
public class AlphabeticComparator implements Comparator {<o:p></o:p>
public int compare(Object o1, Object o2) {<o:p></o:p>
String s1 = (String)o1;<o:p></o:p>
String s2 = (String)o2;<o:p></o:p>
return s1.toLowerCase().compareTo(s2.toLowerCase()); //比较时不考虑大小写<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
public class FruitList {<o:p></o:p>
public static FilenameFilter filter(final String regex) {<o:p></o:p>
return new FilenameFilter() {<o:p></o:p>
private Pattern pattern = Pattern.compile(regex);<o:p></o:p>
public boolean accept(File dir, String name) {<o:p></o:p>
return pattern.matcher(new File(name).getName()).matches();<o:p></o:p>
}<o:p></o:p>
};<o:p></o:p>
}<o:p></o:p>
public static void main(String[] args) {<o:p></o:p>
File path = new File(“.”);<o:p></o:p>
String[] list;<o:p></o:p>
if (args.length == 0)<o:p></o:p>
list = path.list(); //搜索出该目录下所有类型的文件<o:p></o:p>
else<o:p></o:p>
list = path.list(filter(args[0])); //搜索出该目录下指定类型的文件<o:p></o:p>
Arrays.sort(list, new AlphabeticComparator());<o:p></o:p>
for (int i = 0; i < list.length; i++)<o:p></o:p>
System.out.println(list[i]);<o:p></o:p>
}<o:p></o:p>
}在上述代码中,有两个地方使用了Strategy设计模式,一个是AlphabeticComparator类,用来在忽略字符串大小写的情况下提供排序的规则,另一个就是FilenameFilter接口,使用了匿名内部类的设计,然后将其中实现的accept()规则提供给File类的list方法使用。这里是用来判断正则表达式regex是否和文件名匹配,当运行程序在命令操作符中输入“E.*\.java”时,搜索到的是该目录下所有.java文件。<o:p></o:p>
File类除了上述用法外,还可以创建或删除目录,查看文件的信息,包括文件大小、最后修改日期,读写状态等,具体的可以参考JDK文档。<o:p></o:p>
Decorator设计模式<o:p></o:p>
在http://www.j2eesp.com上有对Decorator设计模式的定义:动态给一个对象添加一些额外的职责,就像在墙上刷油漆。使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。Decorator模式规定所有封装于初始对象内部的对象具有相同的接口,这使得该模式的应用具有透明性。<o:p></o:p>
在Java I/O设计中,Decorator模式主要体现在filter类的设计上,抽象类filter是所有Decorator模式类的基类。但是Decorator模式同样存在缺点:在编写程序时,它在给开发人员提供了灵活性的同时,增加了代码的复杂性,造成了Java I/O类操作不便,因为很多I/O设计中都需要应用Decorator模式,增加一些类来完成该设计。<o:p></o:p>
例如在Java 1.0中,FilterInputStream从InputStream中读取数据,FilterOutPutStream向OutputStream中写入数据,在Java 1.1中,相应的有FilterReader和FilterWriter(抽象类,没有子类)用于Decorator模式设计。举个简单的例子:<o:p></o:p>
import java.io.*;<o:p></o:p>
public class DecoratorDemo {<o:p></o:p>
public static void main(String[] args) {<o:p></o:p>
BufferedReader in = new BufferedReader(new FileReader(“FruitList.java”));<o:p></o:p>
String s = new String();<o:p></o:p>
while ((s = in.readLine()) != null)
System.out.println(s);<o:p></o:p>
in.close();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
BufferedReader和FileReader完成了Decorate模式设计,这两个类可以更换为其他具有相同功用的类(在Thinking in Java中称为“修饰器”类)来组合完成特定的任务,正如上文所述,这给开发者提供了多种组合方式,同时也相对的增加了复杂度。
最后,祝blogjava所有成员和Java、开源爱好者元旦快乐!幸福安康!
分享到:
相关推荐
装饰器模式是Java I/O系统的关键设计模式,它允许在运行时动态地增加类的功能,而不必修改原有类的代码。例如,可以通过`FilterInputStream`的子类`BufferedInputStream`来装饰一个`FileInputStream`,从而在读取...
过滤流(FilterStream)是Java I/O中的一种设计模式,它们在已存在的流之上添加额外功能。例如,DataInputStream和DataOutputStream扩展了字节流,增加了对基本类型数据的读写支持;而BufferedInputStream和...
阻塞I/O模型是最常见的I/O模式,在Java中主要体现在`InputStream`和`OutputStream`等基本I/O类上。当一个线程调用read或write方法时,如果数据尚未准备好,那么这个线程会被挂起,即进入阻塞状态,直到数据准备就绪...
5. **装饰者模式的应用**:在Java I/O中,装饰者模式被广泛应用于构建复杂的流管道,如上文中提到的`BufferedReader`就是一个典型的例子,它装饰了一个`InputStreamReader`,后者又装饰了一个`InputStream`。...
2. **事件驱动**:Mina采用事件驱动的设计模式,当网络事件发生时,如数据接收、连接建立或关闭,都会触发相应的事件处理器。这使得代码结构更加清晰,易于理解和维护。 3. **协议独立性**:Mina提供了一个抽象层,...
Java I/O, NIO以及NIO2是Java编程语言中处理输入输出操作的重要API集合,它们分别代表着不同的I/O处理方式和技术。 Java I/O是指传统的I/O操作,涉及经典的I/O类库,如File、RandomAccessFile以及各种流类(stream ...
java23种设计模式,每一种模式都有详细的讲解,很全面,如果你想深入了解一下java23种设计模式,这会非常适合你的哦!上传乃为百度云连接,失效请留言。 内容: 001策略模式! N. B8 ~' D! f9 j+ g0 I 002观察者模式 ...
在高性能服务器设计中,I/O设计模式扮演着至关重要的角色。常见的I/O设计模式有阻塞型、非阻塞同步型和非阻塞异步型。其中,非阻塞异步型I/O设计模式是性能最高、伸缩性最好的。文章将探讨两种高性能I/O设计模式:...
Java C/S(Client/Server)架构是一种常见的软件系统设计模式,其中客户端(Client)与服务器端(Server)通过网络进行通信。在这个特定的应用程序中,我们看到的是一个基于Java编写的桌面客户端应用,它能够与...
Java编程语言作为世界上最广泛使用的编程语言之一,其核心技术与设计模式是每个专业开发者的必备知识。这份压缩包包含了三本非常重要的Java学习资料,分别是《JAVA.2核心技术.卷II:高级特性7th》、《JAVA2核心技术...
Java中的I/O系统设计得非常灵活且强大,它将所有类型的输入/输出抽象成“流”的概念。流是一种有序的数据序列,可以是字节流也可以是字符流。Java提供了多种流来处理不同场景下的输入/输出需求,例如文件读写、网络...
Java设计模式是软件开发中的一种最佳实践,它们是解决常见问题的经验总结,为代码的可扩展性和可维护性提供了强大的工具。在这个主题中,我们将深入探讨三个主要的设计模式:单例模式、工厂模式和装饰模式。 **单例...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。本资源“java设计模式(绝对高清和完整)”提供了全面且清晰的关于Java设计模式的学习材料,由“设计模式公司荣誉出品...
4. **过滤器流**(Filter Stream):这是Java I/O设计模式的一种体现,也称为装饰器模式。过滤器流不直接与数据源或目的地交互,而是包装在一个已存在的流上,用于扩展或修改其功能。例如,`BufferedInputStream`和`...
在Java I/O流库中,装饰器模式被广泛使用,例如BufferedInputStream和DataOutputStream。 5. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。适配器使得原本不兼容的类可以一起工作。在Java中,适配器...
Java的IO库是一个复杂而强大的系统,其设计思想和实现方式体现了多种设计模式,包括Decorator(装饰者)模式和Adapter(适配器)模式。本文将深入探讨这两个模式在Java/IO中的应用,并通过实例解释它们如何使得Java...
在Java中,InputStream、OutputStream等I/O流类库广泛使用了装饰器模式。 6. **适配器模式**:使两个不兼容的接口能够协同工作。通过适配器,旧的接口可以与新的接口兼容。 7. **代理模式**:为其他对象提供一种...
NIO(非阻塞I/O)是Java提供的一种高效I/O模型,与传统的阻塞I/O不同,它允许一个线程处理多个连接,提高了系统的并发性。在聊天系统中,NIO用于优化服务器端对多个客户端连接的处理,避免了因单个连接阻塞而导致的...