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.in
in
System
InputStream
in
つまり、CodeGym での Java の学習のほぼ最初から、データ ストリームを操作し、そこからチェーンを構築してきました。しかし、これからはより意識的にそれを行うようになります。
GO TO FULL VERSION