• [测试]java IO写入文件效率——几种方法比较


    各类写入方法

    /**
     *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();
            }
        }
    }

    测试写入类

    public static void main(String[] args) {
        String str = "abcdefghiJKLMN!";
        int count = 1000000;
        TestOutputStream t = new TestOutputStream();
    
        //1.fileWrite's time
        long start = System.currentTimeMillis();
        t.fileWriteTest(count, str);
        long end = System.currentTimeMillis();
        System.out.println("fileWrite's time---------" + (start - end));
    
        //2.outputStreamTest's time
        start = System.currentTimeMillis();
        t.outputStreamTest(count, str);
        end = System.currentTimeMillis();
        System.out.println("outputStreamTest's time---------" + (start - end));
    
        //3.bufferedOutputTest's time
        start = System.currentTimeMillis();
        t.bufferedOutputTest(count, str);
        end = System.currentTimeMillis();
        System.out.println("bufferedOutputTest's time---------" + (start - end));
    
        //4.bufferedWriteTest's time
        start = System.currentTimeMillis();
        t.bufferedWriteTest(count, str);
        end = System.currentTimeMillis();
        System.out.println("bufferedWriteTest's time---------" + (start - end));
    
        //5.bufferedWrite And FileWriterTest's time
        start = System.currentTimeMillis();
        t.bufferedWriteAndFileWriterTest(count, str);
        end = System.currentTimeMillis();
        System.out.println("bufferedWrite And FileWriterTest's time---------" + (start - end));
    
        //6.bufferedWrite And BufferedOutputStreamTest's time
        start = System.currentTimeMillis();
        t.bufferedWriteAndBufferedOutputStreamTest(count, str);
        end = System.currentTimeMillis();
        System.out.println("bufferedWrite And BufferedOutputStreamTest's time---------" + (start - end));
    }

    测试结果

    /**
     * 测试结果
     * 
     * 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
      */


    总结:

    如果按字符和字节来分类,除方法1和2,其余都是按字符写入文件,字符写入一般比字节快;看java API可知,FileWriter的父类就是OutputStreamWriter,他俩都是实现Writer类,从这点上来说,方法4和6几乎没区别,时间有些微的差别,但内部机制是一样的。

  • 相关阅读:
    codeforces 37 E. Trial for Chief【spfa】
    bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
    codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】
    codeforces GYM 100781A【树的直径】
    bzoj 2878: [Noi2012]迷失游乐园【树上期望dp+基环树】
    bzoj 1791: [Ioi2008]Island 岛屿【基环树+单调队列优化dp】
    codeforces 949C
    codeforces 402E
    poj 3613 Cow Relays【矩阵快速幂+Floyd】
    bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】
  • 原文地址:https://www.cnblogs.com/xiaocaocao/p/4877301.html
Copyright © 2020-2023  润新知