JavaIO(1)—OutputStream详解
文章目录
IO体系
- File类。
包里面有一个单独的File类,这个类是文件和目录路径名的抽象表示形式。这个类里面包含了很多与文件或路径有关的方法,如:创建和删除文件或者路径,获取文件或路径的属性,判断文件或路径是否具有一些性质等。尽管输入输出设备有很多,但是操作最多的还是硬盘,而数据在硬盘上的表现形式就是文件,即File。
OutputStream及其子类:输出字节流。这个体系将数据按照字节格式写入到输出设备(硬盘或屏幕等)。
InputStream及其子类:输入字节流。这个体系读取不同输入设备(键盘,硬盘等)的字节数据源。
Writer及其子类:输出字符流。这个体系将数据按照字符格式写入到输出设备(硬盘或屏幕等)。
Reader及其子类:输入字符流。这个体系将数据按照字符格式写入到输出设备(硬盘或屏幕等)。
- IO中的“装饰者模式”
本文先讲OutputStream字节输出流体系,上面是这个体系的继承关系图。其中1,2,3,4是OutputStream的直接子类,他们分别实现了父类的write()等方法,而且写的形式和目的地各不相同,用来完成不同的任务。还有一个直接子类FilterOutputStream,它及其子类5,6,7就构成了“装饰者模式”,比如子类5:BufferedOutputStream,它可以接受1,2,3,4等直接子类,完成特定任务的同时,使用了缓冲区,提高了效率。
源码分析
File类的使用很简单,不再赘述。本文说一下OutputStream字节输出流及其子类的部分源码,以及“装饰者模式”的应用。
OutputStream类源码
package java.io;
// OutputStream是所有字节输出流的超类,并实现2个接口,这两个接口种分别有一个方法close()和flush()
public abstract class OutputStream implements Closeable, Flushable {
/*
将指定字节写入此文件输出流,子类需实现该方法。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
*/
public abstract void write(int b) throws IOException;
// 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
public void write(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else