? 裝飾者模式( )
系統的核心類 它實現了向文件寫入數據 使用DataOutputStream可以在FileOutputStream的基礎上 增加對多種數據類型的寫操作支持 而BufferedOutputStream裝飾器 可以對FileOutputStream增加緩沖功能 優化I/O的性能 以BufferedOutputStream為代表的性能組件 是將性能模塊和功能模塊分離的壹種典型實現
public static void main(String[] args) throws IOException {
//生成壹個有緩沖功能的流對象
DataOutputStream dout=
new DataOutputStream(new BufferedOutputStream(new FileOutputStream
( C:\\a txt )))
//沒有緩沖功能的流對象
//DataOutputStream dout=new DataOutputStream(new FileOutputStream
( C:\\a txt ))
long begin=System currentTimeMillis()
for(int i= ;i< ;i++)
dout writeLong(i)
System out println( spend: +(System currentTimeMillis() begin))
}
以上代碼顯示FileOutputStream的典型應用 加粗部分是兩種建立OutputStream的方法 第壹種加入了性能組件BufferedOutputStream 第二種則沒有 因此 第壹種方法產生的OutputStream擁有更好的I/O性能
註意 JDK中OutputStream和InputStream類族的實現是裝飾者模式的典型應用 通過嵌套的方式不斷地將對象聚合起來 最終形成壹個超級對象 並使之擁有所有相關子對象的功能
下面來看壹下裝飾者模式如何通過性能組件增強I/O性能 在運行時 工作流程如圖 所示
圖 ? 裝飾者模式的工作流程
在FileOutputStream write()的調用之前 會首先調用BufferedOutputStream write() 它的實現如下
public synchronized void write(byte b[] int off int len) throws IOException {
if (len >= buf length) { //如果要寫入的數據數量大於緩存容量
flushBuffer() ? //寫入所有緩存
out write(b off len) //直接將數據寫入文件
return;
}
if (len > buf length count) {
flushBuffer()
}
System arraycopy(b off buf count len)
//如果寫入的數據比較少 則寫入緩存
count += len;
}
private void flushBuffer() throws IOException {
if (count > ) {
out write(buf count) ? //這裏的out對象就是FileOutputStream
count = ;
}
}
可以看到 並不是每次BufferedOutputStream write()調用都會去磁盤寫入數據 而是將數據寫入緩存中 當緩存滿時 才調用FileOutputStream write()方法 實際寫入數據 以此實現性能組件與功能組件的完美分離
? 返回目錄 Java程序性能優化 讓妳的Java程序更快 更穩定
編輯推薦
? Java程序設計培訓視頻教程
? J EE高級框架實戰培訓視頻教程
? J ME移動開發實戰教學視頻
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
lishixinzhi/Article/program/Java/gj/201311/27821