Java I/O 不容易使用,因为我们必须把核心的 I/O 类型再加上需要的装饰器,才能得到希望的 I/O 对象。
FilterInputStream 与 FilterOutputStream 类会提供装饰器类接口以控制特定的输入流与输出流的类,它们分别是从 I/O 的基类 InputStream 和 OutputStream 派生过来的。
1 使用 FilterInputStream 从 InputStream 中读取数据
FilterInputStream 的类型列表:
类 | 功能 | 构造器参数 | 说明 |
---|---|---|---|
DataInputStream | 与 DataOutputStream 搭配使用,可以从流中读取基本数据类型。 | InputStream | 包含读取基本类型数据的所有接口。 |
BufferedInputStream | 使用缓冲区读取数据。 | InputStream,可以指定缓冲区大小。 | 只是提供缓冲区模式,必须与其他对象搭配使用。 |
LineNumberInputStream | 跟踪输入流中的行号。 | InputStream | 仅增加了行号,必须与其他对象搭配使用。 |
PushbackInputStream | 提供可以弹出一个字节的缓冲区,所以可以将读到的最后一个字符回退。 | InputStream | 编译器的扫描器,供 Java 编译器使用,一般不会用到。 |
一般都要对输入进行缓冲,所以 I/O 库会把无缓冲的输入作为一种特殊情况。
2 使用 FilterOutputStream 从 OutputStream 中写入数据
类 | 功能 | 构造器参数 | 说明 |
---|---|---|---|
DataOutputStream | 与 DataInputStream 搭配使用,可以从流中写入基本数据类型。 | OutputStream | 包含写入基本类型数据的所有接口。 |
PrintStream | 产生格式化后的输出。 | OutputStream | 使用 boolean 指示是否在每次换行时,清空缓冲区。 |
BufferedOutputStream | 使用缓冲区发送数据;flush() 用于清空缓冲区。 | OutputStream,可以指定缓冲区的大小。 | 只是提供缓冲区模式,必须与其他对象搭配使用。 |
PrintStream 中有两个方法:print() 和 println()。重载它们就能打印各种数据类型。println() 与 print() 的不同之处是,它会在操作后添加一个换行符。
PrintStream 有些问题,它会捕获所有的 IOExceptions 类,而且也未完全国际化,也就是说中文字符会出现乱码。