“你好,阿米戈!今天,艾莉跟你讲了有关适配器模式的知识。”

与 I/O 流相关的大多数类都是作为适配器实现的。它们要么转换等效接口,要么将接口连接起来(从简单逐渐到复杂)。

InputStreamReaderBufferedReader 也是适配器吗?至少,它们在使用方式上与适配器非常相似:创建对象后,该对象被传递给另一个类的构造方法。”

“是的,InputStreamReaderInputStream 接口转换为 Reader 接口。BufferedReader 并不是最纯粹的适配器,因为 Java 创建者决定不给它的方法提供自己的独立接口。但理念相同。”

Java 创建者没有编写大量不同的类,而是编写了二十多个适配器,并允许它们以程序员可能希望的任何方式相互连接。

这种方法非常方便。程序员始终可以编写类和/或适配器,让它实现标准接口,并将其包含在正在构建的适配器对象链中。

“那么这就是它的工作原理了。我们构建由简单的对象和适配器组成的链,而不是复杂的大型类。然后,你只需创建它们并按正确顺序将它们组合在一起即可!”

“然后你来实现其余所有的操作。”

“嗯,我明白了。”

“但实际上今天我想向你介绍 ReaderWriter。这是两个抽象类,它们与 InputStream 和 OutputStream 类非常相似。但是与那些类不同,这两个类用于处理字符。它们读取和写入字符。在处理文本信息时,这两个类非常方便。现在我们来看一下它们所包含的方法:”

Reader 方法 方法的用途
int read(char[] cbuf);
“此方法会立即将几个字符读入缓冲区char 数组),直至缓冲区已满或源内不再有可供读取的字符为止。”
该方法返回实际读取的字符数(可以小于数组的长度)
int read();
“此方法读取一个字符并返回该字符。结果被拓展为 int 以便于查看。如果没有可用字符,则方法返回 -1。”
boolean ready();
如果 read 方法有任何未读字符,则此方法返回 true
void close();
此方法“关闭”流。使用完流之后,可以调用此方法。
然后,对象执行关闭文件所需的整理操作,等等。
此时,你无法再从流中读取任何数据。

“事实证明,Reader 的 read(char [] cbuf) 方法使我们可以读取整个字符块,而不是一次读取一个字符。因此更加快捷方便。”

“没错。现在我们来看一下 Writer 包含哪些方法:”

方法 方法的用途
void write(int c);
此方法写入一个字符。int 类型缩略为一个字符。多余部分被直接丢弃。
void write(char[] cbuff);
此方法写入一个字符数组。
void write(String s);
此方法写入一个字符串。直接将其转换为字符数组,然后调用第二个方法。
void flush();
如果流在内部存储尚未写入的任何数据,则此方法强制写入数据。
void close();
此方法“关闭”流。使用完流之后,可以调用此方法。
然后,对象执行关闭文件所需的整理操作,等等。你无法再将数据写入流中,并自动调用 flush。

ReaderWriter 是抽象类,了解这一点非常重要。它们什么都不做,而且几乎不包含任何代码。它们的所有方法都需要在继承它们的类中实现。其任务是标准化类的交互方式。开发人员无需制定自己的标准即可彼此交互。维护几个基本标准对于每个人来说都更加方便。这使得不同程序员编写的类不仅可以轻松地与 Java 创建者编写的类进行交互,而且还可以轻松地与其他程序员编写的类进行交互。

标准很强大。

“我同意。支持通用标准对所有人都有利。”