熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

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

2022-06-13   來源: Java高級技術 

    裝飾者模式(

  系統的核心類它實現了向文件寫入數據使用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數據庫開發優化指南


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27821.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.