4

Scannerとから入力を取得することの違いは何BufferedReaderですか?

ここにBufferedReader例があります...

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");

// read characters
do {
    c = (char) br.read();
    System.out.println(c);
} while(c != 'q');

そして、ここにScanner例があります...

Scanner scan = new Scanner(System.in);
char mrArray = new char[10];
// read characters
for (int i = 0; i < myArray.length; i++) {
    String temp = myScanner.next();
    myArray[i] = temp.charAt(0);
}

2つのケースに違いはありますか?これらのクラスのいずれかが将来変更される可能性はありますか? BufferedStreamよりも優先して使用する必要がありScannerますか?

4

3 に答える 3

6

BufferedReader は、下層のストリームから効率的に読み取るための単純なクラスです。一般に、FileReader のような Reader で作成された各読み取り要求により、対応する読み取り要求が基になるストリームに対して作成されます。read() または readLine() を呼び出すたびに、ファイルからバイトが読み取られ、文字に変換されてから返される可能性がありますが、これは非常に非効率的です。Reader が BufferedReader でゆがめられると、効率が大幅に向上します。
BufferedReader は同期されるため、BufferedReader の読み取り操作は複数のスレッドから安全に実行できます。

一方、スキャナーにはさらに多くのチーズが組み込まれています。BufferedReader が実行できるすべてのことを、同じレベルの効率で実行できます。ただし、さらに Scanner は、正規表現を使用してプリミティブ型と文字列の基になるストリームを解析できます。また、選択した区切り文字で基になるストリームをトークン化することもできます。また、デリミタを無視して、基になるストリームを順方向にスキャンすることもできます! ただし、スキャナーはスレッドセーフではなく、外部で同期する必要があります。

ソース:スキャナーとバッファー リーダー

于 2012-04-17T13:40:20.350 に答える
4

Scanner はストリームのコンテンツからトークンを解析するために使用されますが、BufferedReader はストリームを読み取るだけで特別な解析は行いません。

実際、解析する文字のソースとして BufferedReader をスキャナーに渡すことができ、BufferedReader は同期され、スキャナーは同期されないため、決定するのはあなた次第です。

EDIT System.in はストリームです。

于 2012-04-17T13:38:56.407 に答える
2

主な実際的な違いは、Scannerが 1.5 まで導入されなかったことです。そのため、それ以前は、System.inさまざまなリーダーをラップしてから、出力を自分で解析して必要なものを取得するしかありませんでした。

Scanner は現在、これの多くを管理しているため、BufferedReader を使用して自分で完全に解析/処理するやむを得ない理由がない限り、通常はデフォルトで Scanner を使用します。コードがより明確になるためです。

于 2012-04-17T13:41:50.833 に答える