java的io库用到的装饰模式是如何体现的?
概论
java的io包下大概有85个类,真复杂。其实不然这些类又可以分为以下四个部分。
输入流 输出流
字节流 InputStream OutputStream
字符流 Reader Writer
简单来说,这四部分的对应都是很整齐的,有FileInputStream就有FileOutputStream,有BufferedReader就有BufferedWriter。
为了简便我们就以InputStream为例说说io库中的设计模式------装饰模式
首先关于装饰模式大家请看
http://blog.csdn.net/dlf123321/article/details/9177335
这是我自己在读<<HeadFirst 设计模式>>时做的学习笔记。或者大家可以直接去看HeadFirst。
现在我们看看io的具体类图
FileInputSteam,ByteArrayInputStream就是上面的各种"咖啡",是可以被包装的,前者从文件中读取数据,后者是从字节数组中读取数据。而FilterInputStream就是装饰类的基类,BufferedInputStream就是一个外壳,可以包裹之前所说的那些个"咖啡",它里面有一个InputStream的引用,
现在我说说FileInputSteam与BufferedInputStream
FileInputSteam,就是给文件这个数据源上装一个管道,读数据的时候,就是一个字节一个字节的读。如果把数据源想象成一个水库,使用FileInputSteam就是一滴水一滴水的从桶里取水。
BufferedInputStream它的作用就是在数据源上装一个"小桶"。以后取水的时候就是直接对这个小桶操作(桶首先会从数据源里装上水)。这样一来效率肯定高了。
具体的实现比较复杂,大家可以看看这个
http://icanfly.iteye.com/blog/1207397
别的几个装饰器也类似。
HeadFirst的例子
关于javaio中装饰模式的使用,我不想过多的将具体实现。现在咱们看一个来自HeadFirst的例子。将文件中的大写字面转换成小写字母。
import java.io.*;
public class LowerCaseInputStream extends FilterInputStream {
public LowerCaseInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
int c = super.read();
return (c == -1 ? c : Character.toLowerCase((char)c));
}
public int read(byte[] b, int offset, int len) throws IOException {
int result = super.read(b, offset, len);
for (int i = offset; i < offset+result; i++) {
b[i] = (byte)Character.toLowerCase((char)b[i]);
}
return result;
}
}
public class InputTest {
public static void main(String[] args) throws IOException {
int c;
try {
InputStream in =
new LowerCaseInputStream(
new BufferedInputStream(
new FileInputStream("test.txt")));
while((c = in.read()) >= 0) {
System.out.print((char)c);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
那个test.txt文件里的内容是:asdfwwwwwEEEEEE
最后运行InputTest,输出的内容是asdfwwwwweeeeee
参考资料
http://blog.csdn.net/class281/article/details/24849275
http://www.cnblogs.com/mengdd/archive/2013/02/12/2910302.html
http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html
java的io库用到的装饰模式是如何体现的?的更多相关文章
- 从Decorator,Adapter模式看Java的IO库
我想任何一本介绍模式的书在讲到Decorator模式的时候不能不提到它的实际应用--在Java/IO库里面的应用,<<Java与模式>>这本书也不例外,有点不一样的是,这本书在 ...
- 面试(Java之IO与NIO)
一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...
- java I/O库的设计模式
在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式. 在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和使 ...
- Java学习随笔4:Java的IO操作
1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ...
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
最近研发BDC 云开发部署平台的数据路由及服务管理器意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提 ...
- JAVA的IO学习
IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...
- Java面向对象 IO (一)
Java面向对象 IO (一) 知识概要: (1)IO概述 (2)IO流的常用基类 (3)IO程序的书写 (4)字符流 写入 读取 文本文件的两种读取方式 ...
- (转)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...
- Java的IO系统
Java IO系统 "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务." 由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...
随机推荐
- Windows上C语言实现设置控制台的颜色
这里设置只要调用system();这个函数就行了,参数是字符串,想要设置终端的颜色,按照以下格式可以设置: //数字表示前景色,字母表示背景色 //color 0=黑色 1蓝色 2 绿色 3湖蓝色 4 ...
- Java中Excel导入功能实现、excel导入公共方法_POI -
这是一个思路希望能帮助到大家:如果大家有更好的解决方法希望分享出来 公司导入是这样做的 每个到导入的地方 @Override public List<DataImportMessage> ...
- java多线程的编程实例
java中可有两种方式实现多线程: 一种是继承Thread类: 一种是实现Runnable接口: Thread类 是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的ru ...
- JS和Jquery操作label标签
获取label值: label标签在JS和Jquery中使用不能像其他标签一样用value获取它的值: 代码如下: var label=document.getElementById("s ...
- 学习TensorFlow,concat连接两个(或多个)通道
深度学习中,我们经常要使用的技术之一,连接连个通道作为下一个网络层的输入,那么在tensorflow怎么来实现呢? 我查看了tensorflow的API,找到了这个函数: tf.concat(conc ...
- 音乐API
博主在前几篇博客中介绍了小Q聊天机器人的源码及其包含的一些功能,并在应用市场上上线了一个版本,其中有一个功能是歌曲搜索,即输入格式为"歌曲#歌曲名#歌手"即可搜索出相应的歌曲并进行 ...
- 当freemarker中EL表达式的值为空时出现异常的解决方法
<#list pageView.list as msg> <form name="msgForm" id="msgForm" ...
- 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl
利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...
- JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
JAVA之旅(十九)--ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识 ...
- Java 8时间和日期API 20例
本文由 ImportNew - Sandy 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的 ...