Java 基础文件写入API

0xFF

Java文件读写由于其历史版本兼容原因而略显复杂,笔者遇到项目中复杂文件操作需求,继而不得不从书架上找出10年前的Java核心技术Version 8卷II部分,从Java圣经中找出其文件操作的基本API,下文将由浅入深逐步讨论,事先说明:本文只谈用法,不过多讨论原理。
另外根据编译器规则,等号右侧值决定了等号左侧的数据类型,故此笔者更愿意用最新的语法var占位类型,这种写法实无任何不妥
Java有输入和输出Stream接口(注意读者要将本文所说的Stream对象要与lambda的stream()操作区别开),InputStream用于接收其他源输入数据流(所谓数据流可能为二进制流、对象流、文本流等等,各有对应的对象可以执行不同形式的读入);OutputStream用于向目标写入数据,例如把字符串写入文件;InputStream和OuputStream之间并没有继承统一的Stream接口,所以二者各自为政互不相干,通过JDK的默认实现,二者具有相似的设计模式,而原则保持的相似性进保持在二者共同继承了Closeable接口,即二者可以通过java8try(){...}语句自动释放资源。
输入和输出流各有其对应的Reader和Writer作为Unicode文本读写操作API,需要说明的时Reader和InputStream之间并无继承关系,Reader以构造方法参数依赖于InputStream,Writer和OutputStream亦然。
java的IO操作涉及两大接口:InputStream和OutputStream,二者拥有庞大的实现类群,不同的I/O Stream实现类通过构造函数嵌套的装饰器模式实现面向不同用途的六操作,例如

0x00 OutputStream

OutputStream用于从向目标输出数据。

var stream = new PushbackOutputStream(new BufferedOutputStream(new FileOutputStream("/home/adm/abc.txt")));

上述代码从最内部FileOutputStream开始,它表示一个磁盘文件写入流对象,中间层BufferedOutputStream表示用一个带缓冲的输出流,即数据不立即写入磁盘,而是通过缓冲区写入,且在调用close时先将缓冲写入磁盘再关闭流,最外层PushbackOutputStream表示要最终创建的时一个可以预览一个字节或者具有指定尺寸的回推缓冲区的输出流。
其他OutputStream例如DataOutputStream提供以整形、长整型、布尔类型、byte等基本数据类型方式输出数据。
OutputStream提供了常用方法如下:

public static OutputStream nullOutputStream();//返回舍弃所有字节的空输出流
public abstract void write(int b) throws IOException;//写入一个参数b指定的字节,注意:是字节,b的高24比特会被舍弃。
public void write(byte b[]) throws IOException {//向流中写入一个字节数组
    write(b, 0, b.length);
}
public void write(byte b[], int off, int len) throws IOException {//向流中写入字节数组,off为偏移量,即跳过几个字节,len为实际输入长度
//..
}
public void flush() throws IOException {//将流中原始字节(或字节数组)强制输出到目标
}
public void close() throws IOException {//关闭流,清空流中所有字节
}

从上述代码可以看出,OutputStream的API基本局限于相对底层对byte的操作。而编写业务的程序员更关注诸如:字符串、对象、数值等写。

0x01 Writer

OutputStream作为Java IO对象,提供了基本的流操作API,业务程序员往往更关注写入字符串、数值、布尔等类型,在IO族群中,与OutputStream对应的就是Writer,这里简单介绍一个方便的对象:PrintWriter。
想必大家都比较熟悉System.out.println("");,来看PrintWriter提供的文件写入方式。

var out = new PrintWriter(new FieWriter("/home/adm/abc.txt"));
out.println("Hello World!");//向文本写入一行Hello World!字符串,Linux或Unix下用\n结尾,Windows下以\r\n结尾

上述实例化out对象的PrintWriter构造方法参数可以参考上文进行多种装饰和嵌套。
Writer抽象类实现了AppendableCloseableFlushable接口。Writer抽象类提供5个重载的write方法,提供不同数据类型的写入功能,3个重载的append方法提供数据追加功能;并提供了抽象的flush和close方法(可参照OutputStream的flush和close方法),其他继承自Writer的类,例如上文的PrintWriter提供了各自的独特方法,便于输出操作。
可以认为Writer是作为Stream的工具箱。

posted @ 2022-04-01 18:17  爱文  阅读(208)  评论(0编辑  收藏  举报