代码改变世界

java写文件方法之比较

2011-06-03 18:32  myjava2  阅读(200)  评论(0编辑  收藏  举报
  1. import java.io.BufferedOutputStream;   
  2. import java.io.File;   
  3. import java.io.FileOutputStream;   
  4. import java.io.FileWriter;   
  5. import java.nio.ByteBuffer;   
  6. import java.nio.channels.FileChannel;   
  7.   
  8. /**  
  9.  * 测试各种写文件的方法性能。  
  10.  *   
  11.  * @author 老紫竹 JAVA世纪网(java2000.net)  
  12.  *   
  13.  */  
  14. public class T {   
  15.   
  16.   public static void main(String[] args) {   
  17.     FileOutputStream out = null;   
  18.     FileOutputStream outSTr = null;   
  19.     BufferedOutputStream Buff = null;   
  20.     FileWriter fw = null;   
  21.     int count = 1000000;// 写文件行数   
  22.     try {   
  23.       byte[] bs = "测试java 文件操作/r/n".getBytes();   
  24.       out = new FileOutputStream(new File("C:/add.txt"));   
  25.       long begin = System.currentTimeMillis();   
  26.       for (int i = 0; i < count; i++) {   
  27.         out.write(bs);   
  28.       }   
  29.       out.close();   
  30.       long end = System.currentTimeMillis();   
  31.       System.out.println("FileOutputStream执行耗时:" + (end - begin) + " 豪秒");   
  32.   
  33.       outSTr = new FileOutputStream(new File("C:/add0.txt"));   
  34.       Buff = new BufferedOutputStream(outSTr);   
  35.       long begin0 = System.currentTimeMillis();   
  36.       for (int i = 0; i < count; i++) {   
  37.         Buff.write(bs);   
  38.       }   
  39.       Buff.flush();   
  40.       Buff.close();   
  41.       long end0 = System.currentTimeMillis();   
  42.       System.out.println("BufferedOutputStream执行耗时:" + (end0 - begin0) + " 豪秒");   
  43.   
  44.       fw = new FileWriter("C:/add2.txt");   
  45.       long begin3 = System.currentTimeMillis();   
  46.       for (int i = 0; i < count; i++) {   
  47.         fw.write("测试java 文件操作/r/n");   
  48.       }   
  49.       fw.flush();   
  50.       fw.close();   
  51.       long end3 = System.currentTimeMillis();   
  52.       System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");   
  53.   
  54.       long begin4 = System.currentTimeMillis();   
  55.       String path = "C:/add3.txt";   
  56.       ByteBuffer bb = ByteBuffer.wrap(bs);   
  57.       FileChannel out2 = new FileOutputStream(path).getChannel();   
  58.       for (int i = 0; i < count; i++) {   
  59.         out2.write(bb);   
  60.         bb.rewind();   
  61.       }   
  62.   
  63.       out2.close();   
  64.       long end4 = System.currentTimeMillis();   
  65.       System.out.println("FileChannel执行耗时:" + (end4 - begin4) + " 豪秒");   
  66.     } catch (Exception e) {   
  67.       e.printStackTrace();   
  68.     } finally {   
  69.       try {   
  70.         fw.close();   
  71.         Buff.close();   
  72.         outSTr.close();   
  73.         out.close();   
  74.       } catch (Exception e) {   
  75.         e.printStackTrace();   
  76.       }   
  77.     }   
  78.   }   
  79. }  

 

在我的笔记本上,运行结果如下

FileOutputStream执行耗时:4891 豪秒

BufferedOutputStream执行耗时:78 豪秒

FileWriter执行耗时:438 豪秒

FileChannel执行耗时:2812 豪秒

当然最终生成的文件都是正确的

总结:

BufferedOutputStream 由于有缓冲,性能明显好

FileOutputStream 性能最差,因为其每次都写入字节。

FileWriter 性能很一般

FileChannel使用了nio,但如果没有缓冲,必能太指望性能了