- 浏览: 297658 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (176)
- Algorithm (4)
- Diary (9)
- GIS-RS-GPS (15)
- Hibernate (1)
- JavaSE (4)
- 其他开源 (0)
- 架构与设计 (4)
- Web 客户端技术 (21)
- Web 框架与开发 (6)
- ArcEngine 开发 (2)
- ArcGIS Server 开发 (0)
- ArcIMS 开发 (3)
- 空间数据库 (0)
- Eclipse Plugin (1)
- Eclipse Framework (0)
- GIS-GPS-RS (0)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (54)
- [网站分类]2.Java新手区 (10)
- [网站分类]3.非技术区 (8)
- [网站分类]4.其他技术区 (19)
- [网站分类]6.转载区(Java技术文章转载, 请注明原文出处) (8)
最新评论
-
wen0301:
认同! 程序员必须锻炼内功,而不是华丽的花拳绣腿。
Google的Offer -
leelight:
我用了凸角圆弧法,发现此算法在半径相对较大时,输入结果经常是一 ...
GIS 缓冲区应用及算法实现 -
palmer:
据说 Google 有中国本地的服务器.有没有这方面的原因?? ...
地震为什么没有影响到 Google -
chxkyy:
跑getShapefileFeatureClass方法
AE92 SDK for Java 最小示例学习 -
chxkyy:
我在本地跑这个代码怎么报这个错:java.lang.Unsat ...
AE92 SDK for Java 最小示例学习
Java I/O中的设计模式
作者: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、开源爱好者元旦快乐!幸福安康!
发表评论
-
小议final关键字
2005-10-28 21:50 1773作者:Flyingis final是Java语言中一 ... -
多态学习心得
2005-10-31 19:28 1273作者:Flyingis 这几天我在重新复习Java语言基 ... -
Java接口特性学习
2005-11-02 21:18 1178作者:Flyingis 在Jav ... -
理解Java内部类的基本特性(一)
2005-11-04 17:11 1423作者:Flyingis 内部类是Java语言一个 ... -
理解Java内部类的基本特性(二)
2005-11-04 18:55 1295作者:Flyingis4. 内部类拥有其外围类的所有元素的访 ... -
JSF VS Tapestry 全面比较
2005-11-09 13:08 1264作者:Flyingis Java不像微软拥有Vi ... -
Hibernate学习心得--性能优化
2005-11-15 10:22 1336作者:Flyingis 在使用Hiber ... -
Struts Action的多种角色
2005-11-18 17:10 1249作者:Flyingis ... -
中国企业对软件人才利用的思考
2005-11-21 14:08 1168作者:Flyingis 刚刚看到一篇文章《中方落 ... -
关键字new和newInstance方法区别
2005-12-03 16:48 1204作者:Flyingis 在初始化一个类,生成一个 ... -
Google的Offer
2005-12-07 15:05 1305作者:Flyingis 昨 ... -
Google新服务--出行路线规划服务
2005-12-09 20:04 1511作者: ... -
浅议类型识别与反射机制
2005-12-11 14:43 987作者:Flyingis 运行时类型识别(Run- ... -
ClassCastException深入分析
2005-12-18 18:57 1197作者:Flyingis ClassCastExcep ... -
热点讨论--"Java? It's So Nineties"
2005-12-18 19:32 931作者:Flyingis贴一则消息。今天在各大网站上都 ... -
Java容器分析--List和Set
2005-12-21 15:06 825作者:Flyingis 容器类可以大大提高编程 ... -
GIS数据建库基本思想(上)
2005-12-22 18:43 1235地理信息系统的建设中,数据库的建设极为重要,基础地形 ... -
GIS数据建库基本思想(下)
2005-12-25 15:24 1339GIS数据建库基本思想(上) ... -
Java容器分析--Map
2005-12-27 10:07 1038作者:Flyingis标准的Java类库中包含了几种类 ... -
2006年的 Java IDE
2006-01-05 20:51 690作者: Flyingi ...
相关推荐
装饰器模式是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用于优化服务器端对多个客户端连接的处理,避免了因单个连接阻塞而导致的...