首页 > 学院 > 开发设计 > 正文

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

2019-11-14 15:26:27
字体:
来源:转载
供稿:网友

各类写入方法

/** *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几乎没区别,时间有些微的差别,但内部机制是一样的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表