java 常用写文件方式性能PK

java写文件这个应用场景相信是所有java开发者最常用的操作了,从jdk1.7以来到底选择哪一种方式写文件,借周末的时间,简单写了几个常用的FileOutputStream、BufferedOutputStream、FileWriter、BufferedWriter,具体代码如下:


import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;


/**
 * 写文件性能测试
 * 
 * @author 李小强
 * @since jdk1.6
 * @version 2017年7月10日 李小强
 */
public class FileTest {
    
    /**
     * 构造函数
     */
    public FileTest() {
        
    }
    
    /**
     * FIXME 方法注释信息(此标记由Eclipse自动生成,请填写注释信息删除此标记)
     *
     *


     * 
     *

     * 
     * @param args aa
     */
    public static void main(String[] args) {
        int count = 1000000;// 写文件行数
        System.out.println("FileOutputStream执行耗时,豪秒数:");
        for (int i = 0; i < 10; i++) {
            fileStream(count);
        }
        System.out.println("BufferedOutputStream执行耗时,豪秒数:");
        for (int i = 0; i < 10; i++) {
            bufferStream(count);
        }
        System.out.println("FileWriter执行耗时,豪秒数:");
        for (int i = 0; i < 10; i++) {
            fileWriter(count);
        }
        System.out.println("BufferedWriter执行耗时,豪秒数:");
        for (int i = 0; i < 10; i++) {
            bufferedWriter(count);
        }
        
    }
    
    /**
     * FileWriter 写文件
     * 
     * @param count 文件行数
     */
    private static void fileWriter(int count) {
        FileWriter objFw = null;
        try {
            long begin = System.currentTimeMillis();
            objFw = new FileWriter("C:/add2.txt");
            for (int i = 0; i < count; i++) {
                objFw.write("测试java 文件操作\r\n");
            }
            objFw.close();
            long end = System.currentTimeMillis();
            System.out.println(end - begin);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objFw != null) {
                    objFw.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * BufferedOutputStream 写文件
     * 
     * @param count 文件行数
     */
    private static void bufferStream(int count) {
        FileOutputStream outSTr = null;
        BufferedOutputStream Buff = null;
        try {
            long begin = System.currentTimeMillis();
            outSTr = new FileOutputStream(new File("C:/add0.txt"));
            Buff = new BufferedOutputStream(outSTr);
            for (int i = 0; i < count; i++) {
                Buff.write("测试java 文件操作\r\n".getBytes());
            }
            Buff.flush();
            Buff.close();
            long end = System.currentTimeMillis();
            System.out.println(end - begin);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (Buff != null) {
                    Buff.close();
                }
                if (outSTr != null) {
                    outSTr.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /***
     * FileOutputStream 写文件
     * 
     * @param count 文件行数
     */
    private static void fileStream(int count) {
        FileOutputStream out = null;
        try {
            long begin = System.currentTimeMillis();
            out = new FileOutputStream(new File("C:/add.txt"));
            for (int i = 0; i < count; i++) {
                out.write("测试java 文件操作\r\n".getBytes());
            }
            out.close();
            long end = System.currentTimeMillis();
            System.out.println(end - begin);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /***
     * BufferedWriter 写文件
     * 
     * @param count 文件行数
     */
    private static void bufferedWriter(int count) {
        BufferedWriter objWriter = null;
        try {
            long begin = System.currentTimeMillis();
            objWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/add3.txt")));
            for (int i = 0; i < count; i++) {
                objWriter.write("测试java 文件操作\r\n");
            }
            objWriter.flush();
            objWriter.close();
            long end = System.currentTimeMillis();
            System.out.println(end - begin);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (objWriter != null) {
                    objWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

按写五千、一万、五万、十万、五十万、一百万、五百万行代码,每轮执行十次,取最大、最小、平均值,测试结果如下:

一次性写5000行大小的文件 一次性写10000行大小的文件
第N次 FileOutputStream BufferedOutputStream FileWriter BufferedWriter 第N次 FileOutputStream BufferedOutputStream FileWriter BufferedWriter
1 63 4 25 10 93 13 64 9
2 60 32 50 3 39 17 8 4
3 30 10 6 7 34 4 17 7
4 18 2 90 4 33 102 4 4
5 18 4 3 4 34 4 4 4
6 17 3 2 3 33 100 4 4
7 23 3 3 3 32 4 5 3
8 19 3 3 2 80 4 4 4
9 17 3 3 3 35 4 4 4
10 17 3 3 8 34 4 4 3
平均值 28.2 6.7 18.8 4.7 平均值 44.7 25.6 11.8 4.6
最大值 63 32 90 10 最大值 93 102 64 9
最小值 17 2 2 2 最小值 32 4 4 3
一次性写50000行大小的文件 一次性写100000行大小的文件
第N次 FileOutputStream BufferedOutputStream FileWriter BufferedWriter 第N次 FileOutputStream BufferedOutputStream FileWriter BufferedWriter
1 244 18 66 25 1 541 31 81 27
2 184 11 13 12 2 452 29 25 19
3 192 15 14 12 3 395 35 24 18
4 210 10 13 11 4 382 44 24 18
5 190 11 16 11 5 379 25 25 19
6 189 11 17 12 6 356 24 26 18
7 184 15 13 11 7 382 28 25 59
8 186 11 14 11 8 381 22 23 19
9 178 13 13 11 9 372 24 69 20
10 183 12 12 11 10 372 20 24 17
平均值 194 12.7 19.1 12.7 平均值 401.2 28.2 34.6 23.4
最大值 244 18 66 25 最大值 541 44 81 59
最小值 178 10 12 11 最小值 356 20 23 17
一次性写500000行大小的文件 一次性写1000000行大小的文件
第N次 FileOutputStream BufferedOutputStream FileWriter BufferedWriter 第N次 FileOutputStream BufferedOutputStream FileWriter BufferedWriter
1 1794 94 156 114 1 3573 204 282 173
2 1600 87 129 80 2 3238 182 204 179
3 1577 81 98 81 3 3316 177 254 199
4 1588 81 99 81 4 4248 176 207 164
5 1579 82 97 82 5 3278 169 210 191
6 1566 83 114 116 6 3328 184 224 171
7 1579 91 101 82 7 3509 183 201 164
8 1639 81 111 81 8 3228 168 223 162
9 1608 84 96 79 9 3230 216 207 166
10 1583 80 105 80 10 3183 163 226 191
平均值 1611.3 84.4 110.6 87.6 平均值 3413.1 182.2 223.8 176
最大值 1794 94 156 116 最大值 4248 216 282 199
最小值 1566 80 96 79 最小值 3183 163 201 162

最后结论是:BufferedWriter占了绝对优势,而FileOutputStream是最差,并且性能相差好多倍建议使用BufferedWriter;当然还有好多方案没测试,欢迎大写补充

你可能感兴趣的:(Java基础,java,写文件)