java IO寫入檔案效率——幾種方法比較

來源:互聯網
上載者:User

測試寫入類

 

/**
  * 測試結果
  *
  * 1.file's long:16kb
  *
  fileWrite's time----------36
  outputStreamTest's time----------167
  bufferedOutputTest's time----------17
  bufferedWriteTest's time----------14
  bufferedWrite And FileWriterTest's time----------9
  bufferedWrite And BufferedOutputStreamTest's time----------12
  *
  * 2.file's long:1600kb
  fileWrite's time----------69
  outputStreamTest's time----------1282
  bufferedOutputTest's time----------68
  bufferedWriteTest's time----------40
  bufferedWrite And FileWriterTest's time----------52
  bufferedWrite And BufferedOutputStreamTest's time----------37
  *
  * 3.file's long:16000kb
  fileWrite's time----------555
  outputStreamTest's time----------12448
  bufferedOutputTest's time----------599
  bufferedWriteTest's time----------346
  bufferedWrite And FileWriterTest's time----------316
  bufferedWrite And BufferedOutputStreamTest's time----------358
  
  4.file's long:160000kb
  
  fileWrite's time----------5203
  outputStreamTest's time----------127182
  bufferedOutputTest's time----------5972
  bufferedWriteTest's time----------3445        最優
  bufferedWrite And FileWriterTest's time----------5904
  bufferedWrite And BufferedOutputStreamTest's time----------5353
  
  
  5.file's long:1600000kb
  
  fileWrite's time----------50416
  outputStreamTest's time----------1303242
  bufferedOutputTest's time----------60931
  bufferedWriteTest's time----------46697
  bufferedWrite And FileWriterTest's time----------48710
  bufferedWrite And BufferedOutputStreamTest's time----------64354
  */

 public static void main(String[] args) {

  String str = "abcdefghiJKLMN!";
  int count = 1000000;
  TestOutputStream t = new TestOutputStream();
  long start = System.currentTimeMillis();
  t.fileWriteTest(count, str);
  long end = System.currentTimeMillis();
  System.out.println("fileWrite's time---------" + (start - end));

  start = System.currentTimeMillis();
  t.outputStreamTest(count, str);
  end = System.currentTimeMillis();
  System.out.println("outputStreamTest's time---------" + (start - end));

  start = System.currentTimeMillis();
  t.bufferedOutputTest(count, str);
  end = System.currentTimeMillis();
  System.out
    .println("bufferedOutputTest's time---------" + (start - end));
  
  start = System.currentTimeMillis();
  t.bufferedWriteTest(count, str);
  end = System.currentTimeMillis();
  System.out.println("bufferedWriteTest's time---------" + (start - end));
  
  start = System.currentTimeMillis();
  t.bufferedWriteAndFileWriterTest(count, str);
  end = System.currentTimeMillis();
  System.out.println("bufferedWrite And FileWriterTest's time---------" + (start - end));
  
  start = System.currentTimeMillis();
  t.bufferedWriteAndBufferedOutputStreamTest(count, str);
  end = System.currentTimeMillis();
  System.out.println("bufferedWrite And BufferedOutputStreamTest's time---------" + (start - end));
  
  
  
 }
 

 /**
  *1 按位元組寫入 FileOutputStream
  *
  * @param count 寫入迴圈次數
  * @param str 寫入字串
  */
 public void outputStreamTest(int count, String str) {
  File f = new File("f:test1.txt");
  OutputStream os = null;
  try {
   os = new FileOutputStream(f);
   for (int i = 0; i < count; i++) {
    os.write(str.getBytes());
   }
   os.flush();
   System.out.println("file's long:" + f.length());
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    os.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 /**
  *2 按位元組緩衝寫入 BufferedOutputStream
  *
  * @param count 寫入迴圈次數
  * @param str 寫入字串
  */
 public void bufferedOutputTest(int count, String str) {
  File f = new File("f:test2.txt");
  BufferedOutputStream bos = null;
  try {
   OutputStream os = new FileOutputStream(f);
   bos = new BufferedOutputStream(os);
   for (int i = 0; i < count; i++) {
    bos.write(str.getBytes());
   }
   bos.flush();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    bos.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 /**
  *3 按字元寫入 FileWriter
  *
  * @param count 寫入迴圈次數
  * @param str 寫入字串
  */
 public void fileWriteTest(int count, String str) {
  File f = new File("f:test.txt");
  Writer writer = null;
  try {
   writer = new FileWriter(f);
   for (int i = 0; i < count; i++) {
    writer.write(str);
   }
   writer.flush();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    writer.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

 /**
  *4 按字元緩衝寫入 BufferedWriter
  *
  * @param count 寫入迴圈次數
  * @param str 寫入字串
  */
 public void bufferedWriteTest(int count, String str) {
  File f = new File("f:test3.txt");
  OutputStreamWriter writer = null;
  BufferedWriter bw = null;
  try {
   OutputStream os = new FileOutputStream(f);
   writer = new OutputStreamWriter(os);
   bw = new BufferedWriter(writer);
   for (int i = 0; i < count; i++) {
    bw.write(str);
   }
   bw.flush();
   if(f.exists()){
    f.delete();
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    bw.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 /**
  *5 按字元緩衝寫入 BufferedWriter and BufferedOutputStream
  *
  * @param count 寫入迴圈次數
  * @param str 寫入字串
  */
 public void bufferedWriteAndBufferedOutputStreamTest(int count, String str) {
  File f = new File("f:test4.txt");
  BufferedOutputStream bos=null;
  OutputStreamWriter writer = null;
  BufferedWriter bw = null;
  try {
   OutputStream os = new FileOutputStream(f);
   bos=new BufferedOutputStream(os);
   writer = new OutputStreamWriter(bos);
   bw = new BufferedWriter(writer);
   for (int i = 0; i < count; i++) {
    bw.write(str);
   }
   bw.flush();
   if(f.exists()){
    f.delete();
    System.out.println("delete---");
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    bw.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 /**
  *6 按字元緩衝寫入 BufferedWriter and FileWriter
  *
  * @param count 寫入迴圈次數
  * @param str 寫入字串
  */
 public void bufferedWriteAndFileWriterTest(int count, String str) {
  File f = new File("f:test5.txt");
  FileWriter fw=null;
  BufferedWriter bw = null;
  try {
   fw=new FileWriter(f);
   bw = new BufferedWriter(fw);
   for (int i = 0; i < count; i++) {
    bw.write(str);
   }
   bw.flush();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    bw.close();
    if(f.exists()){
     f.delete();
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 

總結:

如果按字元和位元組來分類,除方法1和2,其餘都是按字元寫入檔案,字元寫入一般比位元組快;看java API可知,FileWriter的父類就是OutputStreamWriter,他倆都是實現Writer類,從這點上來說,方法4和6幾乎沒區別,時間有些微的差別,但內部機制是一樣的,而且方法6較簡單,定義變數稍,以前總用方法4,看來以後得改變下了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.