當前位置:名人名言大全網 - 短信平臺 - Java程序性能優化-裝飾者模式(4)

Java程序性能優化-裝飾者模式(4)

  ? 裝飾者模式( )

 系統的核心類 它實現了向文件寫入數據 使用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