1.InputStreamReaderクラス
ストリームのもう 1 つの興味深い機能は、複数のストリームを結合してチェーンにできることです。ストリームは、内部データ ソースだけでなく、別のストリームからもデータを読み取ることができます。
これは Java の非常に強力なメカニズムであり、ストリームを別のストリームに接続することで複雑なデータ読み取りシナリオを作成できるようになります。このようなスキームは次のようになります。

プログラムがデータ ストリームからデータを読み取ると、データ ストリームはそのデータ ソース (たとえば、別のデータ ストリームまたはファイル) からデータを読み取ります。
さらに、各データ ストリームはデータを読み取ったり出力したりするだけでなく、データを変換したり、データに対してさまざまな操作を実行したりすることもできます。このような「中間ストリーム」の好例はInputStreamReaderクラスです。
というクラスはすでに知っていますFileReader。これは、Readerファイルからデータを読み取る です。そしてInputStreamReaderそのデータはどこから得ているのでしょうか? そうです、 からですInputStream。
オブジェクトを作成するときは、オブジェクトまたはその子孫クラスの 1 つInputStreamReaderを渡す必要があります。InputStream例:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
クラスInputStreamReaderにはそのクラスが持つすべてのメソッドがありReader、それらはまったく同じように機能します。
クラスとの主な違いはInputStreamReader、たとえば、FileReaderデータをどこから読み取るかです。FileReaderはファイルからデータを読み取りますが (当然のことですが、それが と呼ばれる理由ですFileReader)、.InputStreamReaderからデータを読み取りますInputStream。
FileReaderメソッドを使用してオブジェクトから文字を読み取るとread()、ディスク上のファイルから 2 バイトを読み取り、それらを として返しますchars。
InputStreamReaderこのメソッドを使用してオブジェクトから文字を読み取るとread()、メソッドは渡されたオブジェクトから 2 バイトを読み取りFileInputStream、次にファイルからデータを読み取ります。その結果、メソッド呼び出しのチェーンがread()生成されます。
2.BufferedReaderクラス
よく使用する可能性が高いもう 1 つの興味深いクラスは、 ですBufferedReader。これは、別のストリームからデータを読み取る「中間ストリーム」でもあります。
その名前が示すように、このBufferedReaderクラスは のサブクラスでありReader、文字を読み取ることができます。しかし、最も興味深いのは、文字を読み取ることができるストリーム、つまりクラスを継承するストリームの形式でデータ ソースも渡す必要があることですReader。
ポイントは何ですか?とは異なりInputStreamReader、このBufferedReaderクラスはバイトを文字に変換しません。つまり、何も変換しません。代わりに、データをバッファリングします。

プログラムがBufferedReaderオブジェクトから 1 つの文字を読み取るとき、オブジェクトはソース ストリームから大量の文字配列を一度に読み取ります。そしてそれらを内部に保存します。
次の文字がオブジェクトから読み取られるとBufferedReader、データ ソースにアクセスせずに、内部バッファ配列から次の文字を取得して返します。バッファ内のすべての文字が使い果たされた場合にのみ、別の大きな文字配列が読み取られます。
このBufferedReaderクラスには非常に便利なメソッドもあります — を使用するとString readLine()、ソース ストリームからデータの文字列全体を一度に読み取ることができます。このメソッドを使用すると、たとえば、ファイルを読み取り、その内容を画面に 1 行ずつ表示できます。例:
これがいかに便利かを説明するために、特にコンパクトなコードをいくつか書きました。このコードは、もう少し詳しく記述することもできます。
|
オブジェクトを作成しますFileReader。データソースはファイルです。オブジェクトを作成します BufferedReader。データ ソースは ですFileReader。リーダーにデータがある限り 1 行読み取り 1 行 表示 |
複数のストリームを連結する場合、close()メソッドを呼び出す必要があるのはそのうちの 1 つだけです。close()そのストリームは、最終データ ストリームで呼び出されるまで、そのデータ ソースでメソッドを呼び出します。
3. コンソールからの読み取り
そして、もう 1 つ興味深い事実がScannerあります。クラスは、データ ストリームでもある からデータを読み取る中間入力ストリームにすぎませんSystem.in。
コンソールから行を読み取る 2 つの方法を次に示します。
| スキャナクラス | BufferedReader クラスと BufferedWriter クラス |
|---|---|
|
|
私たちの友人はクラスの静的変数にすぎません。という名前のです。System.ininSystemInputStreamin
つまり、CodeGym での Java の学習のほぼ最初から、データ ストリームを操作し、そこからチェーンを構築してきました。しかし、これからはより意識的にそれを行うようになります。
GO TO FULL VERSION