Java之写文件
时间:2022-04-27
本文章向大家介绍Java之写文件,主要内容包括java之写文件、2. 生成目录、3. 写文件、3. 测试用例、4. 博文相关、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
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
一般使用流程
- 创建文件对象
File file = new File("xxx.txt");
- 用流装载文件
OutputStream fr = new FileOutputStream(file);
- 如果用缓冲区,则用缓冲区装载流,用缓冲区是为了提高读写性能
BufferedOutputStream br = new BufferedOutputStream(fr);
- 写文件:
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之通过反射生成并初始化对象
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释