Java之写文件

java之写文件

上一篇写了java读取文件的各种操作姿势,这里也补一个写文件的工具类,比较简单

1. 读写类介绍 (和上一篇差不多)

java读写文件的IO流分两大类,字节流和字符流,基类分别是字符:Reader和Writer;字节:InputStream和OutPutStream

字符流分为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

一般使用流程

  1. 创建文件对象 File file = new File("xxx.txt");

  2. 用流装载文件 OutputStream fr = new FileOutputStream(file);

  3. 如果用缓冲区,则用缓冲区装载流,用缓冲区是为了提高读写性能 BufferedOutputStream br = new BufferedOutputStream(fr);

  4. 写文件: br.write(xxx)

写文件,可以按字节方式写入,也可以按照字符方式写入文件,写文件,包括是否是追加写,编码方式等

2. 生成目录

写文件之前, 文件可以不存在,但文件所在的目录必须有,所以就有个生成目录的方法了

提供了一个工具类 DirUtil, 可以递归生成path路径对应的所有目录(前提是有权限)

    /**     * 递归创建文件夹     *     * @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();
            }
        }
    }

3. 写文件

提供了两种写文件的方式,字节流输出和字符流输出,其中字符流输出时,制定了编码格式为UTF-8, 这个工具的实现方式与读的工具类不太相同,先看下代码结构

/**
 * 写文件工具类
 * <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模式 的输出方式

  • 每次完毕之后,需要显示调用关闭方法

3. 测试用例

代码结构比较简单,实现 + 测试都是一目了然,直接贴出代码和结果

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

测试用例演示

4. 博文相关

源码直通车: https://git.oschina.net/liuyueyi/quicksilver/tree/master/silver-file?dir=1&filepath=silver-file

读文件链接:java之的读取文件大全

反射生成对象博文: java之通过反射生成并初始化对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值