java IO以追加方式写文件FileWrite 文章分类:Java编程 package com.demo.test; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class WriteFile { /** * fileName文件名不带扩展名 * content写入内容 * head CSV表头 * @param fileName * @param content * @param head */ public static void write(String fileName, String content, String head) { String dirPath = null; File dirFile = null; File file = null; FileWriter fw=null; BufferedWriter bw=null; try { dirPath = System.getProperty("user.dir") + File.separator + "N2510data"; dirFile = new File(dirPath); if(!dirFile.exists()){ dirFile.mkdirs(); System.out.println(dirFile.getAbsolutePath()+"N2510data文件夹创建成功..."); } file = new File(dirFile, fileName + ".csv"); if (file.exists()) { if (file.length() > 1024 * 100) { File destFile = new File(dirFile, fileName + "-"+ System.currentTimeMillis() + ".csv"); file.renameTo(destFile); WriteFile.createFileAndWriteHead(file, head); } }else{ WriteFile.createFileAndWriteHead(file, head); } fw = new FileWriter(file, true); bw = new BufferedWriter(fw); bw.write(content); bw.newLine(); bw.flush(); bw.close(); } catch (IOException e) { e.printStackTrace(); }finally{ bw=null; fw=null; } } /** * 创建文件并写入表头 * @param file * @param head */ public static void createFileAndWriteHead(File file, String head) { FileWriter fw=null; BufferedWriter bw=null; try { if (!file.exists()) { if (file.createNewFile()) { fw = new FileWriter(file, true); bw = new BufferedWriter(fw); bw.write(head); bw.newLine(); bw.flush(); bw.close(); } else { System.out.println("When you create file has error..."); } } } catch (IOException e) { e.printStackTrace(); }finally{ bw=null; fw=null; } } public static void main(String args[]) { while (true) { int i = 0; WriteFile.write("ff", "1000000000000000000000000000000000000", "001,002,003"); i++; if (i > 100000) { break; } } } }
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; /** * 测试各种写文件的方法性能。 * * @author 老紫竹 JAVA世纪网(java2000.net) * */ public class T { public static void main(String[] args) { FileOutputStream out = null; FileOutputStream outSTr = null; BufferedOutputStream Buff = null; FileWriter fw = null; int count = 1000000;// 写文件行数 try { byte[] bs = "测试java 文件操作\r\n".getBytes(); out = new FileOutputStream(new File("C:/add.txt")); long begin = System.currentTimeMillis(); for (int i = 0; i < count; i++) { out.write(bs); } out.close(); long end = System.currentTimeMillis(); System.out.println("FileOutputStream执行耗时:" + (end - begin) + " 豪秒"); outSTr = new FileOutputStream(new File("C:/add0.txt")); Buff = new BufferedOutputStream(outSTr); long begin0 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { Buff.write(bs); } Buff.flush(); Buff.close(); long end0 = System.currentTimeMillis(); System.out.println("BufferedOutputStream执行耗时:" + (end0 - begin0) + " 豪秒"); fw = new FileWriter("C:/add2.txt"); long begin3 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { fw.write("测试java 文件操作\r\n"); } fw.flush(); fw.close(); long end3 = System.currentTimeMillis(); System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒"); long begin4 = System.currentTimeMillis(); String path = "C:/add3.txt"; ByteBuffer bb = ByteBuffer.wrap(bs); FileChannel out2 = new FileOutputStream(path).getChannel(); for (int i = 0; i < count; i++) { out2.write(bb); bb.rewind(); } out2.close(); long end4 = System.currentTimeMillis(); System.out.println("FileChannel执行耗时:" + (end4 - begin4) + " 豪秒"); } catch (Exception e) { e.printStackTrace(); } finally { try { fw.close(); Buff.close(); outSTr.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } } } } 在我的笔记本上,运行结果如下 FileOutputStream执行耗时:4891 豪秒 BufferedOutputStream执行耗时:78 豪秒 FileWriter执行耗时:438 豪秒 FileChannel执行耗时:2812 豪秒 当然最终生成的文件都是正确的 总结: BufferedOutputStream 由于有缓冲,性能明显好 FileOutputStream 性能最差,因为其每次都写入字节。 FileWriter 性能很一般 FileChannel使用了nio,但如果没有缓冲,必能太指望性能了