`
flyingis
  • 浏览: 297770 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

作者:Flyingis

    任何程序语言的
I/O设计都是一项具有挑战的任务,因为数据的传输存在多种可能,这些可能不仅存在于数据发送端和接收端(文件、网络链接等),还存在于这些数据的多种存在方式,例如缓冲区数据、顺序存取数据、字符数据、字节数据等等。<!----><o:p></o:p>

JavaI/O使用“流”这个抽象的概念,它屏蔽了实际的I/O设备中处理数据的细节。在实际的应用中,我们很少使用单一的类来创建流对象,而是通过多个对象来提供所需要的I/O功能。Java1.01.11.4I/O类库作了多次重大修改,具体的可以参考相关的书籍或Sun官方网站。这里是从模式的角度来分析JavaI/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中,FilterInputStreamInputStream中读取数据,FilterOutPutStreamOutputStream中写入数据,在Java 1.1中,相应的有FilterReaderFilterWriter(抽象类,没有子类)用于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>

    BufferedReaderFileReader完成了Decorate模式设计,这两个类可以更换为其他具有相同功用的类(在Thinking in Java中称为“修饰器”类)来组合完成特定的任务,正如上文所述,这给开发者提供了多种组合方式,同时也相对的增加了复杂度。

    最后,祝blogjava所有成员和Java、开源爱好者元旦快乐!幸福安康!

分享到:
评论

相关推荐

    java I/O类的使用

    装饰器模式是Java I/O系统的关键设计模式,它允许在运行时动态地增加类的功能,而不必修改原有类的代码。例如,可以通过`FilterInputStream`的子类`BufferedInputStream`来装饰一个`FileInputStream`,从而在读取...

    深入分析 Java I/O 的工作机制(转载)

    过滤流(FilterStream)是Java I/O中的一种设计模式,它们在已存在的流之上添加额外功能。例如,DataInputStream和DataOutputStream扩展了字节流,增加了对基本类型数据的读写支持;而BufferedInputStream和...

    java阻塞i/o与非阻塞i/o控制

    阻塞I/O模型是最常见的I/O模式,在Java中主要体现在`InputStream`和`OutputStream`等基本I/O类上。当一个线程调用read或write方法时,如果数据尚未准备好,那么这个线程会被挂起,即进入阻塞状态,直到数据准备就绪...

    Java I/O总结

    5. **装饰者模式的应用**:在Java I/O中,装饰者模式被广泛应用于构建复杂的流管道,如上文中提到的`BufferedReader`就是一个典型的例子,它装饰了一个`InputStreamReader`,后者又装饰了一个`InputStream`。...

    java i/o 开发框架mina

    2. **事件驱动**:Mina采用事件驱动的设计模式,当网络事件发生时,如数据接收、连接建立或关闭,都会触发相应的事件处理器。这使得代码结构更加清晰,易于理解和维护。 3. **协议独立性**:Mina提供了一个抽象层,...

    Java I-O NIO and NIO2

    Java I/O, NIO以及NIO2是Java编程语言中处理输入输出操作的重要API集合,它们分别代表着不同的I/O处理方式和技术。 Java I/O是指传统的I/O操作,涉及经典的I/O类库,如File、RandomAccessFile以及各种流类(stream ...

    java23种设计模式

    java23种设计模式,每一种模式都有详细的讲解,很全面,如果你想深入了解一下java23种设计模式,这会非常适合你的哦!上传乃为百度云连接,失效请留言。 内容: 001策略模式! N. B8 ~' D! f9 j+ g0 I 002观察者模式 ...

    两种高性能IO设计模式(ReactorProactor)的比较

    在高性能服务器设计中,I/O设计模式扮演着至关重要的角色。常见的I/O设计模式有阻塞型、非阻塞同步型和非阻塞异步型。其中,非阻塞异步型I/O设计模式是性能最高、伸缩性最好的。文章将探讨两种高性能I/O设计模式:...

    JAVA C/S架构应用程序

    Java C/S(Client/Server)架构是一种常见的软件系统设计模式,其中客户端(Client)与服务器端(Server)通过网络进行通信。在这个特定的应用程序中,我们看到的是一个基于Java编写的桌面客户端应用,它能够与...

    java核心技术1/2卷java设计模式三合一

    Java编程语言作为世界上最广泛使用的编程语言之一,其核心技术与设计模式是每个专业开发者的必备知识。这份压缩包包含了三本非常重要的Java学习资料,分别是《JAVA.2核心技术.卷II:高级特性7th》、《JAVA2核心技术...

    java jsp IO包 教程 新手入门

    Java中的I/O系统设计得非常灵活且强大,它将所有类型的输入/输出抽象成“流”的概念。流是一种有序的数据序列,可以是字节流也可以是字符流。Java提供了多种流来处理不同场景下的输入/输出需求,例如文件读写、网络...

    java设计模式

    Java设计模式是软件开发中的一种最佳实践,它们是解决常见问题的经验总结,为代码的可扩展性和可维护性提供了强大的工具。在这个主题中,我们将深入探讨三个主要的设计模式:单例模式、工厂模式和装饰模式。 **单例...

    java设计模式(绝对高清和完整)

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。本资源“java设计模式(绝对高清和完整)”提供了全面且清晰的关于Java设计模式的学习材料,由“设计模式公司荣誉出品...

    JAVA课件Java IO.ppt

    4. **过滤器流**(Filter Stream):这是Java I/O设计模式的一种体现,也称为装饰器模式。过滤器流不直接与数据源或目的地交互,而是包装在一个已存在的流上,用于扩展或修改其功能。例如,`BufferedInputStream`和`...

    经典设计模式讲解以及项目实战(Java版)

    在Java I/O流库中,装饰器模式被广泛使用,例如BufferedInputStream和DataOutputStream。 5. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。适配器使得原本不兼容的类可以一起工作。在Java中,适配器...

    Java-从Decorator,Adapter模式看Java/IO

    Java的IO库是一个复杂而强大的系统,其设计思想和实现方式体现了多种设计模式,包括Decorator(装饰者)模式和Adapter(适配器)模式。本文将深入探讨这两个模式在Java/IO中的应用,并通过实例解释它们如何使得Java...

    java经典设计模式(中文版)

    在Java中,InputStream、OutputStream等I/O流类库广泛使用了装饰器模式。 6. **适配器模式**:使两个不兼容的接口能够协同工作。通过适配器,旧的接口可以与新的接口兼容。 7. **代理模式**:为其他对象提供一种...

    Java实现C/S架构的聊天系统

    NIO(非阻塞I/O)是Java提供的一种高效I/O模型,与传统的阻塞I/O不同,它允许一个线程处理多个连接,提高了系统的并发性。在聊天系统中,NIO用于优化服务器端对多个客户端连接的处理,避免了因单个连接阻塞而导致的...

Global site tag (gtag.js) - Google Analytics