15.4 输入输出流体系 15.4.1 处理流的用法

15.4 输入输出流体系

节点流存在差异 代码不统一

上一节介绍了输入输出流的4个抽象基类,并介绍了4个访问文件的节点流的用法。通过上面示例程序不难发现,4个基类使用起来有些烦琐。

处理流屏蔽底层节点流的区别 代码统一

如果希望简化编程,这就需要借助于处理流了。
这里有一张图片
图15.7显示了处理流的功能,处理流可以隐藏底层设备上节点流的差异,并对外提供更加方便的输入输出方法,让程序员只需关心高级流的操作

使用处理流的典型思路

使用处理流时的典型思路是,使用处理流来包装节点流,程序通过处理流来执行输入/输岀功能让节点流与底层的I/O设备、文件交互。

如何区分处理流和节点流

处理流的构造器参数是另一个流

实际识别处理流非常简单,只要流的构造器参数不是一个物理节点,而是已经存在的流,那么这种流就一定是处理流;

节点流构造器参数是物理节点

而所有节点流都是直接以物理IO节点作为构造器参数的.

使用处理流的优势

关于使用处理流的优势,归纳起来就是两点:

  • 对开发人员来说,使用处理流进行输入/输出操作更简单;
  • 使用处理流的执行效率更高

程序 使用处理流PrintStream

下面程序使用PrintStream处理流来包装OutputStream,使用处理流后的输出流在输出时将更加方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.*;

public class PrintStreamTest {
public static void main(String[] args) {
try (
// 物理流的构造器参数是物理节点(文件路径)
FileOutputStream fos = new FileOutputStream("test.txt");
// 处理流的构造器参数是另一个流对象
PrintStream ps = new PrintStream(fos)) {
// 使用PrintStream执行输出
ps.println("普通字符串");
// 直接使用PrintStream输出对象
ps.println(new PrintStreamTest());
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}

上面程序中先定义了一个节点输出流FileOutputStream,然后程序使用PrintStream包装了该节点输出流,最后使用PrintStream来输出字符串、输出对象…

Printstream的输出功能非常强大,前面程序中一直使用的标准输出System.out的类型就是PrintStream

输出文本内容建议使用PrintStream

由于PrintStream类的输出功能非常强大,通常如果需要输岀文本内容,都应该将输出流包装成PrintStream后进行输出。

从前面的代码可以看出,程序使用处理流非常简单,通常只需要在创建处理流时传入一个节点流作为构造器参数即可,这样创建的处理流就是包装了该节点流的处理流。

只需要关闭最上层的处理流

在使用处理流包装了底层节点流之后,关闭输入输出流资源时,只要关闭最上层的处理流即可关闭最上层的处理流时,系统会自动关闭被该处理流包装的节点流