装饰者模式()
系统的核心类它实现了向文件写入数据使用DataOutputStream可以在FileOutputStream的基础上增加对多种数据类型的写操作支持而BufferedOutputStream装饰器可以对FileOutputStream增加缓沖功能优化I/O的性能以BufferedOutputStream为代表的性能组件是将性能模块和功能模块分离的一种典型实现
public static void main(String[] args) throws IOException {
//生成一个有缓沖功能的流对象
DataOutputStream dout=
new DataOutputStream(new BufferedOutputStream(new FileOutputStream
(C:\\atxt)))
//没有缓沖功能的流对象
//DataOutputStream dout=new DataOutputStream(new FileOutputStream
(C:\\atxt))
long begin=SystemcurrentTimeMillis()
for(int i=;i<;i++)
doutwriteLong(i)
Systemoutprintln(spend:+(SystemcurrentTimeMillis()begin))
}
以上代码显示FileOutputStream的典型应用加粗部分是两种建立OutputStream的方法第一种加入了性能组件BufferedOutputStream第二种则没有因此第一种方法产生的OutputStream拥有更好的I/O性能
注意JDK中OutputStream和InputStream类族的实现是装饰者模式的典型应用通过嵌套的方式不断地将对象聚合起来最终形成一个超级对象并使之拥有所有相关子对象的功能
下面来看一下装饰者模式如何通过性能组件增强I/O性能在运行时工作流程如图所示
图 装饰者模式的工作流程
在FileOutputStreamwrite()的调用之前会首先调用BufferedOutputStreamwrite()它的实现如下
public synchronized void write(byte b[] int off int len) throws IOException {
if (len >= buflength) { //如果要写入的数据数量大于缓存容量
flushBuffer() //写入所有缓存
outwrite(b off len) //直接将数据写入文件
return;
}
if (len > buflength count) {
flushBuffer()
}
Systemarraycopy(b off buf count len)
//如果写入的数据比较少则写入缓存
count += len;
}
private void flushBuffer() throws IOException {
if (count > ) {
outwrite(buf count) //这里的out对象就是FileOutputStream
count = ;
}
}
可以看到并不是每次BufferedOutputStreamwrite()调用都会去磁盘写入数据而是将数据写入缓存中当缓存满时才调用FileOutputStreamwrite()方法实际写入数据以此实现性能组件与功能组件的完美分离
返回目录Java程序性能优化让你的Java程序更快更稳定
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
JME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南