BufferedReader
JavaとInputStreamReader
クラスの違いは何ですか?
7 に答える
BufferedReader は、ネイティブ I/O が呼び出されるたびに情報をバッファリングする「InputStreamReader/FileReader」の両方のラッパーです。
文字 (またはバイト) を読み取る場合と、大きな数値を読み取る場合の効率の違いを想像できます。一度に(またはバイト)の文字数。BufferedReader を使用すると、単一の文字を読み取りたい場合、その内容を格納してそのバッファーを埋め (空の場合)、それ以降の要求では、文字がバッファーから直接読み取られるため、効率が向上します。
InputStreamReader は、バイト ストリームを文字ストリームに変換します。バイトを読み取り、指定された文字セットを使用して文字にデコードします。使用する文字セットは、名前で指定するか、明示的に指定するか、プラットフォームのデフォルトの文字セットを受け入れることができます。
それが役に立てば幸い。
メイン メモリからの読み取りは、ディスク/STDIN からの読み取りよりも高速です。
BufferedReader
チャンクをメイン メモリにコピーすることで、ディスク/STDIN から読み取る頻度を減らすことができるバッファリングと呼ばれる手法を使用します。
検討:
BufferedReader in = new InputStreamReader(System.in);
in.read(); //
in.read(); //
// ...
in.read(); // could be hitting the disk/STDIN a lot (slow!)
対:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.read(); //
in.read(); //
// ...
in.read(); // hitting main memory a lot (fast!)
ドキュメントから:
バッファリングを行わないと、を呼び出すたびに
read()
[disk/STDIN] からバイトが読み取られ、文字に変換されてから返される可能性があり、非常に非効率的です。
2 つのクラスは の同じインターフェイスを実装しますReader
。InputStreamReader
そのため、なしでも使用できますが、パフォーマンスが低下BufferedReader
する可能性があります。ここではデコレータ パターンを使用しているだけなので、バッファリング機能を持つ になります。InputStreamReader
InputStreamReaderクラスは、タイプInputStream (未解釈のバイト) をReaderクラス (一部の文字セットで文字として解釈されるバイト) に適合させますが、追加のバッファリングは適用しません。BufferedReaderクラスはReaderクラス (おそらくバッファリングされていない) を取り、それにバッファリングを適用します。
BufferedReader は、指定されたストリームからいくつかの文字を読み取り、それをバッファーに格納します。これにより、入力が高速になります。
InputStreamReader は、指定されたストリームから 1 文字だけを読み取り、残りの文字はストリームに残ります。
例:
class NewClass{
public static void main(String args[]) throws IOException{
BufferedReader isr = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
System.out.println("B.R. - "+(char)isr.read());
System.out.println("Scanner - " + sc.nextLine());
}
}
isr.read() ステートメントを実行すると、「hello」と入力すると、「hello」の文字「h」が画面に出力されます。これが InputStreamReader の場合、残りの文字「ello」は System.in ストリームに残り、sc.nextLine() はそれらを出力します。しかし、この場合は、BufferedReader が System.in ストリームからすべての「hello」文字を読み取り、それらを独自の個人用バッファーに格納するため、sc.nextLine() が実行されたときに System.in ストリームが空のままになるため、発生しません。実行されました。
コードの場合:
class NewClass{
public static void main(String args[]) throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
Scanner sc = new Scanner(System.in);
System.out.println("I.S.R. - "+(char)isr.read());
System.out.println("Scanner - " + sc.nextLine());
}
}
この場合、InputStreamReader は「hello」入力の 1 文字のみを読み取り、残りの「ello」は引き続き System.in ストリームに残り、これらの文字は sc.nextLine() によって出力されます。
結論:
BufferedReader は、入力ストリームから数文字 (1 文字だけが必要な場合でも、それ以上の文字を読み取ることになります) を読み取り、それらをバッファーに格納します。それが BufferedReader と呼ばれる理由です。一度に読み取った文字数を把握できませんでした。この回答をテストしたところ、3 から 10 まで変化しました。
InputStreamReader は入力ストリームから 1 文字だけを読み取り、残りの文字はストリームに残ります。この場合、中間バッファーはありません。
1 つ以上のスレッドまたはオブジェクトが System.in から文字を読み取りたい場合、その場合は InputStreamReader を使用する必要があります。これは、1 文字のみを読み取り、残りを他のオブジェクトまたはスレッドで使用できるためです。
BufferedReader は、バッファーを維持し、バッファーからのデータの取得は、ディスク/stdin からのデータの取得と比較して常に高速であるため、高速です。
私が理解しているように、InputStreamReader の代わりに BufferedReader は、データをバイトから文字に変換するのにかかる時間が短いため、パフォーマンスを向上させるために BufferedReader を優先します