上一篇写了java读取文件的各类操做姿式,这里也补一个写文件的工具类,比较简单java
java读写文件的IO流分两大类,字节流和字符流,基类分别是字符:Reader和Writer;字节:InputStream和OutPutStreamgit
字符流分为FileReader和FileWrtier,这两个的父类是InputStreamReader和OutStreamWrtier工具
字节流分为FileInputStream和FileOutPutStream性能
继承关系表测试
Reader->InputStreamReader->FileReader Reader->BufferedReader Writer->OutputStreamWriter->FileWriter Writer->BufferedWriter InputStream->FileInputStream。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。 InputStream->FilterInputStream->BufferedInputStream OutputStream->FileOutputStream。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter OutputStream->FilterOutputStream->BufferedOutputStream
通常使用流程ui
File file = new File("xxx.txt");
OutputStream fr = new FileOutputStream(file);
BufferedOutputStream br = new BufferedOutputStream(fr);
br.write(xxx)
写文件,能够按字节方式写入,也能够按照字符方式写入文件,写文件,包括是不是追加写,编码方式等this
写文件以前, 文件能够不存在,但文件所在的目录必须有,因此就有个生成目录的方法了编码
提供了一个工具类 DirUtil
, 能够递归生成path
路径对应的全部目录(前提是有权限).net
/** * 递归建立文件夹 * * @param file 由目录建立的file对象 * @throws FileNotFoundException */ public static void mkDir(File file) throws FileNotFoundException { if (file == null) { throw new FileNotFoundException(); } if (file.getParentFile().exists()) { if (file.exists()) { // 目录存在, 则直接返回 return; } if (!file.mkdir()) { // 不存在, 则建立 throw new FileNotFoundException(); } } else { mkDir(file.getParentFile()); // 建立父目录 if (!file.exists() && !file.mkdir()) { throw new FileNotFoundException(); } } }
提供了两种写文件的方式,字节流输出和字符流输出,其中字符流输出时,制定了编码格式为UTF-8
, 这个工具的实现方式与读的工具类不太相同,先看下代码结构code
/** * 写文件工具类 * <p/> * Created by yihui on 2017/5/17. */ public class FileWriteUtil { public enum WriteType { BUFFER, WRITER } private Object output; private WriteType currentType; public static FileWriteUtil newInstance(WriteType writeType, String filename, boolean isAppend) throws IOException { return new FileWriteUtil(writeType, filename, isAppend); } private FileWriteUtil(WriteType writeType, String filename, boolean isAppend) throws IOException { currentType = writeType; if (writeType == WriteType.BUFFER) { output = new BufferedOutputStream(new FileOutputStream(filename, isAppend)); } else if (writeType == WriteType.WRITER) { output = new OutputStreamWriter(new FileOutputStream(filename, isAppend), Charset.forName("UTF-8")); } } public FileWriteUtil write(String data) throws IOException { if (currentType == WriteType.BUFFER) { ((BufferedOutputStream) output).write(data.getBytes()); ((BufferedOutputStream) output).flush(); } else { ((OutputStreamWriter) output).write(data); ((OutputStreamWriter) output).flush(); } return this; } public void close() throws IOException { if (currentType == WriteType.BUFFER) { ((BufferedOutputStream) output).close(); } else { ((OutputStreamWriter) output).close(); } } }
com.hust.hui.quicksilver.file.FileWriteUtil.newInstance(xxx)
方式来获取实例对象,而后持有这个对象进行写入操做write()
方法返回对象自引用, 所以支持相似 builder模式
的输出方式代码结构比较简单,实现 + 测试都是一目了然,直接贴出代码和结果
@Test public void testBufWrite() throws IOException { FileWriteUtil fileWrite = FileWriteUtil.newInstance(FileWriteUtil.WriteType.BUFFER, "bufWrite.txt", false); try { fileWrite.write("hello world") .write("\n") .write("你好😄《-表情符》"); } finally { fileWrite.close(); } } @Test public void testWriterWrite() throws IOException { FileWriteUtil fileWrite = FileWriteUtil.newInstance(FileWriteUtil.WriteType.WRITER, "writerWrite.txt", false); try { fileWrite.write("hello world") .write("\n") .write("你好😄《-表情符》"); } finally { fileWrite.close(); } }
测试用例演示
源码直通车: https://git.oschina.net/liuyueyi/quicksilver/tree/master/silver-file?dir=1&filepath=silver-file
读文件连接:java之的读取文件大全
反射生成对象博文: java之经过反射生成并初始化对象