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