java IO写入文件效率——几种方法比较

原创 2011年01月08日 17:28:00

测试写入类

 

/**
  * 测试结果
  *
  * 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,看来以后得改变下了。

java的三种写文件方法的效率性能比较

java的三种写文件方法的效率性能比较 转自:http://www.codesky.net/article/200912/118652.html 最近对以前开发的一个通用数据迁移的软件进行...
  • nysyxxg
  • nysyxxg
  • 2016年07月13日 23:23
  • 3442

Java文件读写IO/NIO及性能比较总结

干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记。经常想得捡起,但总是因为一些原因,不能如愿。 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来。 文件...
  • chenleixing
  • chenleixing
  • 2015年03月11日 22:59
  • 12611

Java 之 文件读写及性能比较总结

 干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记。经常想得捡起,但总是因为一些原因,不能如愿。 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起...
  • djun100
  • djun100
  • 2014年05月12日 17:56
  • 19581

java 文件写入API速度对比

在平时开发中,需要向文件中写数据的操作,用的非常多,java中比较常用的类有FileOutputStream、BufferedOutputStream和BufferedWriter,这三个类在写文件的...
  • fengxingzhe001
  • fengxingzhe001
  • 2017年03月28日 15:59
  • 951

Java批量生成文件并写入内容

最近写一些网页,这些网页里面有部分内容是相同的,网页文件名要求也是有规律的。一看这些需求就觉得可以用程序实现。一般做法是重复复制粘贴的动作,但是文件多起来就有点烦了。所以要用程序解放生产力。程序代码p...
  • lwhlwh2012
  • lwhlwh2012
  • 2017年06月23日 22:36
  • 400

调用Java NIO提高文件读写速度(1)

http://developer.51cto.com/art/201111/302489_1.htm   Java NIO的创建目的是为了让Java程序员可以实现高速I/O而无需编写自定义的本...
  • cynhafa
  • cynhafa
  • 2012年08月04日 10:13
  • 1999

Java 之 文件读写及性能比较总结

干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记。经常想得捡起,但总是因为一些原因,不能如愿。 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来。 ...
  • lostinai
  • lostinai
  • 2015年12月11日 16:09
  • 595

Java 文件读写最好是用buffer对于大文件可以加快速度

参考例子: FileReader fileReader = new FileReader(filename); BufferedReader bufferedReader = new...
  • u013458516
  • u013458516
  • 2016年11月29日 18:43
  • 874

Java-文件读取写入整型(字节流)

学习流的套接技术 通过异常来判断是否读到文件结尾 利用available()判断文件流是否结束 对文件读取写入整型import java.io.DataInputStream; import j...
  • xanlv
  • xanlv
  • 2016年05月23日 21:41
  • 2163

io流使用缓冲区提高读写效率

---------------------- android培训、java培训、期待与您交流! ---------------------- 缓冲区有:BufferedWriter写入流的缓冲区和B...
  • u011053624
  • u011053624
  • 2013年06月26日 15:17
  • 1404
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java IO写入文件效率——几种方法比较
举报原因:
原因补充:

(最多只允许输入30个字)