「こんにちは、アミーゴ! 今日はエリーがアダプターのパターンについて話しました。」

I/O ストリームに関連するほとんどのクラスはアダプターとして実装されます。同等のインターフェイスを変換するか、単純なインターフェイスから始めて複雑なインターフェイスに移行して接続します。

InputStreamReaderBufferedReaderもアダプターですか? 少なくとも、使用方法はアダプターと非常によく似ています。オブジェクトが作成された後、それは別のクラスのコンストラクターに渡されます。」

「はい、InputStreamReader は、 InputStreamインターフェースをReaderインターフェースに変換します。BufferedReader、純粋な形ではアダプターではありません。Java の作成者が、そのメソッドに独自の別個のインターフェースを与えないと決めたからです。しかし、これは同類の精神です。」

Java の作成者は、無数の異なるクラスを作成する代わりに、20 個のアダプターを作成し、プログラマーが望むように相互に接続できるようにしました。

このアプローチは非常に便利です。プログラマはいつでもクラスやアダプタを作成し、それに標準インターフェイスを実装させ、構築中のアダプタ オブジェクトのチェーンに含めることができます。

「これがすべての仕組みです。大きく複雑なクラスの代わりに、単純なオブジェクトとアダプターのチェーンを作成します。そして、それらを作成して正しい順序で組み合わせるだけです。」

「そして、欠けているものは何でも実装します。」

"うん、分かった。"

「でも実際、今日はReaderWriterについて話したいと思っていました。これらは、InputStream クラスと OutputStream クラスに非常によく似た 2 つの抽象クラスです。しかし、これらのクラスとは異なり、これら 2 つのクラスは文字を処理します。これらは文字の読み取りと書き込みを行います。テキスト情報を扱うときに非常に便利です。それらのメソッドを見てみましょう:"

リーダーメソッド メソッドの内容
int read(char[] cbuf);
「このメソッドは、バッファーがいっぱいになるか、ソースに読み取る文字がなくなるまで、すぐにいくつかの文字をバッファー( char 配列)に読み取ります。」 このメソッドは、実際に読み取られた文字数を返します (配列の長さよりも小さい場合があります)。
int read();
「このメソッドは 1 文字を読み取り、それを返します。結果は、見た目の int に拡張されます。使用可能な文字がない場合、メソッドは -1 を返します。」
boolean ready();
このメソッドは、読み取りメソッドに未読の文字がある場合に true を返します。
void close();
このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。
その後、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。
この時点では、ストリームからそれ以上データを読み取ることはできません。

「Reader のread(char [] cbuf)メソッドを使用すると、一度に 1 文字ずつではなく、文字のブロック全体を読み取ることができることがわかりました。そのため、より高速で便利です。」

「その通りです。それでは、Writer がどのようなメソッドを持っているか見てみましょう:」

方法 メソッドの内容
void write(int c);
このメソッドは 1 文字を書き込みます。int 型は char に絞り込まれます。余分な部分は単純に破棄されます。
void write(char[] cbuff);
このメソッドは文字の配列を書き込みます。
void write(String s);
このメソッドは文字列を書き込みます。これは単純に文字の配列に変換され、2 番目のメソッドが呼び出されます。
void flush();
ストリームがまだ書き込まれていないデータを内部に保存している場合、このメソッドはそのデータを強制的に書き込みます。
void close();
このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。
その後、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。ストリームにデータを書き込むことはできなくなり、flush が自動的に呼び出されます。

ReaderWriter は抽象クラスであることを理解することが重要です。これらは何も行わず、実質的にコードは含まれません。これらのメソッドはすべて、それらを継承するクラスに実装する必要があります。彼らの仕事は、クラスがどのように相互作用するかを標準化することです。開発者は、相互に対話するために独自の標準を考案する必要はありません。いくつかの基本的な基準を維持する方が、誰にとってもはるかに便利です。これにより、さまざまなプログラマが作成したクラスが、Java の作成者が作成したクラスだけでなく、他のプログラマが作成したクラスとも簡単に対話できるようになります。

標準は強力です。

「同意します。共通の標準をサポートすることは、すべての人にとって有益です。」