文档章节

Java之写文件

小灰灰Blog
 小灰灰Blog
发布于 2017/05/17 20:01
字数 872
阅读 45
收藏 2
点赞 0
评论 0

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
粉丝 160
博文 150
码字总数 258693
作品 0
武汉
程序员
Java基础|Java特性与HelloWorld运行流程

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

darlingwood2013 ⋅ 05/29 ⋅ 0

SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘 ⋅ 06/16 ⋅ 0

win10下java的jdk安装和环境变量配置

首先需要去JAVA官网下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html 下载的是jdk 9 与以往的环境配置不一样 jdk是java的核心 是java软件的开...

codingcoge ⋅ 03/09 ⋅ 0

14、Java并发性和多线程-Java ThreadLocal

以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有...

easonjim ⋅ 2017/06/16 ⋅ 0

JNI开发流程与引用数据类型的处理

今天我们来看下Java JNI,先看下维基百科给的定义, JNI, Java Native Interface, Java本地接口,是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用或库,也可以被其他程序调用。...

juexingzhe ⋅ 05/04 ⋅ 0

Win10系统下eclipse的基本配置 编码格式 classpath原理 import工作机制

eclipse是用来编译java文件的一个软件 国内也有汉化版,我也不知道该怎么上传……忘了从哪里搞来了 不过用了一段时间就还原原来的配置了因为网上的教程之类的方法都是英文版的 为了和网上的配...

codingcoge ⋅ 03/17 ⋅ 0

Drools7.x环境搭建与简单示例

Drools是个规则引擎的开源实现。官方文档比较长。这里提供一个方法,搭建最基本的Drools运行环境,并提供一个简单示例。 环境准备: JDK 至少需要JDK 1.5以上,JDK去这里下载:http://www.or...

supergao222 ⋅ 01/10 ⋅ 0

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

深入理解JVM学习笔记(一、总览)

1、JVM历史 2、JVM内存结构 3、JVM垃圾回收机制 4、JVM性能监控工具 5、JVM性能调优案例时间 6、JVM类文件结构 7、JVM类加载机制 8、JVM字节码执行引擎 9、JVM虚拟机编译及其运行时优化 10、...

jintaohahahaha ⋅ 05/28 ⋅ 0

彻底明白编译型和解释型、动态语言和静态语言区别

编译型和解释型的区别 先来看看编译型语言定义: 编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码(二进制)。 再来看看解释型语言的定义: 解释型语言的源代码不是直接翻译成机...

chenxuxu ⋅ 05/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

中标麒麟(龙芯版)7.0优盘安装

########################################## 制作U盘安装盘: 1.准备U盘: PMON环境下U盘必须格式化成ext3; 昆仑固件环境下可以格式化成ext3,ext4 2.把整个镜像 xxx.iso 复制到U盘下面 3....

gugudu ⋅ 15分钟前 ⋅ 0

老司机写的大数据建模五步走

本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。 01 第一步:选择模型或自定义模式 这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。 比如,如果要预...

gulf ⋅ 24分钟前 ⋅ 0

PacificA 一致性协议解读

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。 在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。 不管是 ZAB,Raf...

黑客画家 ⋅ 27分钟前 ⋅ 0

盘符图标个性化

设置自己的专属盘符图标 准备ico格式的图片文件一个,在根目录下创建autorun.inf文件 文件内容 [Autorun]icon=logo.ico 重新启动或者插拔U盘即可看到结果...

阿豪boy ⋅ 27分钟前 ⋅ 0

Windows下QQ聊天记录中图片的默认存放位置

Windows下QQ聊天记录中图片的默认存放位置在设置中是没有说明的。 实测位置在:D:\Documents\Tencent Files\974101467\Image 其中: “974101467”为对应的QQ号; “C2C”为个人之间的聊天图...

临江仙卜算子 ⋅ 33分钟前 ⋅ 0

GC 的三种基本实现方式

参考资料《代码的未来》(作者: [日] 松本行弘)。 由于并非本人原著(我只是个“搬运工“),SO 未经本人允许请尽情转载。 另外个人像说明一下这里所说的GC指泛指垃圾回收机制,而单指Jav...

xixingzhe ⋅ 34分钟前 ⋅ 0

Android双击退出

/** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode......

王先森oO ⋅ 38分钟前 ⋅ 0

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 44分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 47分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 51分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部