java 文件写入API速度对比

在平时开发中,需要向文件中写数据的操作,用的非常多,java中比较常用的类有FileOutputStream、BufferedOutputStream和BufferedWriter,这三个类在写文件的速度上有些差异,下面通过测试看一下差异有多大,
测试场景是,向文件写入循环写入数据:

public class Trade {

    // 先设定写入10000行数据
    private static final int COUNT = 100000;
    /**
     * 比较时间
     */
    public void compareTime() {
        System.out.println("====start======");
        useFileOStream();
        useBufferOStream();
        useBufferedWriter();
        System.out.println("=====end========");
    }

    /**
     * 使用FileOutputStream
     */
    public void useFileOStream() {
        try {
            File file = new File("text01.txt");
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file,true);

            long begin = System.currentTimeMillis();
            for (int i = 0; i < COUNT; i++) {
                fos.write("java--测试写文件 fos\r\n".getBytes());
            }
            fos.flush();
            fos.close();
            System.out.println("FileOutputStream执行耗时: " + (System.currentTimeMillis() - begin));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 使用BufferedOutputStream
     */
    public void useBufferOStream() {
        try {
            File file = new File("text02.txt");
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file,true);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            long begin = System.currentTimeMillis();
            for (int i = 0; i < COUNT; i++) {
                bos.write("java--测试写文件 fos\r\n".getBytes());
            }
            bos.flush();
            bos.close();
            System.out.println("BufferedOutputStream执行耗时: " + (System.currentTimeMillis() - begin));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用Filewriter
     */
    public void useBufferedWriter() {
        try {
            File file = new File("text03.txt");
            if (!file.exists()) {
                file.createNewFile();
            }
             // 一次写入的文件大小小于10M时, bufferedWriter并不能显著降低时间,而且此时BufferedOutputStream仍是占优的
            FileWriter fWriter = new FileWriter(file,true);
            BufferedWriter bufferedWriter = new BufferedWriter(fWriter);
            long begin = System.currentTimeMillis();
            for (int i = 0; i < COUNT; i++) {
                bufferedWriter.write("java--测试写文件 fos\r\n");
            }
            bufferedWriter.flush();
            bufferedWriter.close();
            System.out.println("BufferedWriter 执行耗时: " + (System.currentTimeMillis() - begin));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

新建一个测试类:

public class Test {

    public static void main(String[] args) {
        Trade trade = new Trade();
        // 测试写入操作的速度
        trade.compareTime();
    }

}

当一次写入100000行字符串时,执行耗时如下:

====start======
FileOutputStream执行耗时: 250ms
BufferedOutputStream执行耗时: 15ms
BufferedWriter 执行耗时: 31ms
=====end========

当一次写入300000行字符串时(文件大小为6446kb),执行耗时如下:

====start======
FileOutputStream执行耗时: 642ms
BufferedOutputStream执行耗时: 47ms
Filewriter执行耗时: 46ms
=====end========

当一次写入500000行字符串时(文件大小为10M),执行耗时如下:

====start======
FileOutputStream执行耗时: 1139ms
BufferedOutputStream执行耗时: 79ms
BufferedWriter 执行耗时: 63ms
=====end========

当一次写入1000000行字符串时(文件大小为20.9M),执行耗时如下:

====start======
FileOutputStream执行耗时: 2097ms
BufferedOutputStream执行耗时: 142ms
BufferedWriter 执行耗时: 109ms
=====end========

由此可见,FileOutputStream不管什么时候,写入速度都是最慢的,BufferedOutputStream在写入的数据量不算大的情况下,速度比BufferedWriter要快,但当数据量变大时(>6M),BufferedWriter的写入速度是最快的。
根据测试结果,在实际开发中提高效率,我们可以灵活选用java的io类:数据量小的时候,选择BufferedOutputStream,数据量大的时候,选择BufferedWriter

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值