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 行ずつ表示できます。例:

これがいかに便利かを説明するために、特にコンパクトなコードをいくつか書きました。このコードは、もう少し詳しく記述することもできます。

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
オブジェクトを作成しますFileReader。データソースはファイルです。
オブジェクトを作成しますBufferedReader。データ ソースは ですFileReader
リーダーにデータがある限り
1 行読み取り 1 行
表示
重要な点:

複数のストリームを連結する場合、close()メソッドを呼び出す必要があるのはそのうちの 1 つだけです。close()そのストリームは、最終データ ストリームで呼び出されるまで、そのデータ ソースでメソッドを呼び出します。



3. コンソールからの読み取り

そして、もう 1 つ興味深い事実がScannerあります。クラスは、データ ストリームでもある からデータを読み取る中間入力ストリームにすぎませんSystem.in

コンソールから行を読み取る 2 つの方法を次に示します。

スキャナクラス BufferedReader クラスと BufferedWriter クラス
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

私たちの友人はクラスの静的変数にすぎません。という名前のです。System.ininSystemInputStreamin

つまり、CodeGym での Java の学習のほぼ最初から、データ ストリームを操作し、そこからチェーンを構築してきました。しかし、これからはより意識的にそれを行うようになります。