文档章节

Java之写文件

小灰灰Blog
 小灰灰Blog
发布于 2017/05/17 20:01
字数 872
阅读 49
收藏 2

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之通过反射生成并初始化对象

© 著作权归作者所有

共有 人打赏支持
小灰灰Blog
粉丝 187
博文 190
码字总数 334310
作品 0
武汉
程序员
私信 提问
JVM系列第3讲:到底什么是虚拟机?

我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上...

陈树义
2018/11/09
0
0
PHP-Java-Bridge的使用(平安银行支付功能专版)

去年做平安银行的时候,用到了PHP-Java-Bridge,后来写了一篇博客记录使用PHP-Java-Bridge的一些心得(连接:http://my.oschina.net/kenblog/blog/316234)。 后来有很多陆陆续续的朋友在做平...

卖小女孩的小火柴
2015/04/13
0
1
Java 的另一个替代,编程语言 Mirah

当你使用Ruby语法,添加静态类型,并在JVM上运行时,发生了什么?Charles Nutter,JRuby的设计师为我们做了展示: 我们很快将有Java 7,支持API的动态调用和改进。我们有很多编程语言可供选择...

红薯
2011/03/28
7.4K
29
通过Shell脚本用JDBC连数据库脱离项目框架执行Java业务流程

一.概述 如果项目中需要使用到定时任务来完成某些业务,一般有两种做法:定时任务依赖于项目;定时任务用批处理(windows执行)或者shell脚本(Linux)启动,不依赖于项目。 个人觉得,定时任...

谢思华
2015/08/10
0
0
Java基础|Java特性与HelloWorld运行流程

【Java基础】 Java语言特点:(着重了解两个)开源、跨平台。 跨平台如何实现:通过JVM实现,JVM充当Java和不同OS之间的翻译器,不同OS对应不同JVM。 Java语言的平台:JavaSE、JavaME(Androi...

darlingwood2013
2018/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 定义新的异常

#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main......

天王盖地虎626
30分钟前
0
0
PDMan-2.1.1 发布:用心开源,免费的国产数据库建模工具(春节前最后一个版本)

一、软件介绍 PDMan 是一款开源免费的数据库模型建模工具,是PowerDesigner之外另一种更好的选择。支持Windows,Mac,Linux等操作系统,具有上手容易,使用简单的特点。 2018年获得码云GVP (Gi...

O龙猫O
54分钟前
10
0
OSChina 周二乱弹 —— 以后我偷小鱼干养你

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @庞巴哥 :只有这节奏瞬间变得轻松。。。。。。。。。分享Talking Eyes的单曲《In the sun (Extended Version)》: 《In the sun (Extended Ve...

小小编辑
今天
82
5
多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
9
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部