3

重複の可能性:
Scanner と BufferedReader

何らかの入力を読み取るために java.util.Scanner を使用するのが適切な状況はありますか? 私の小さなテストでは、java.util.Bufferedreader や java.util.InputStreamReader から独自のリーダーを実装するのに比べて、信じられないほど遅いことがわかりました。

では、スキャナーを使用したい理由はありますか?

4

5 に答える 5

6

ドキュメントから:

正規表現を使用してプリミティブ型と文字列を解析できる単純なテキスト スキャナー。

それは BufferedReader を行いません。

于 2012-09-12T12:30:09.840 に答える
4

クラスのScanner主な目的は、正規表現を使用してプリミティブ型と文字列のテキストを解析することです。読み取るリソースの種類をいくつか指定できます。

于 2012-09-12T12:30:33.473 に答える
3

Scanner は比較的低速ですが、十分に高速であることが多く、BufferedReader よりもはるかに強力です。

public static void main(String... args) throws IOException {

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++)
        sb.append("line: ").append(i).append("\n");
    String lines = sb.toString();

    for (int i = 0; i < 6; i++) {
        testBufferedReader(lines);
        testScanner(lines);
    }
}

private static void testBufferedReader(String text) throws IOException {
    int count = 0;
    BufferedReader br = new BufferedReader(new StringReader(text));
    long start = System.nanoTime();
    while (br.readLine() != null)
        count++;
    long time = System.nanoTime() - start;
    System.out.printf("BufferedReader.readLine() took an average of %,d ns count=%,d%n", time / count, count);
}

private static void testScanner(String text) throws IOException {
    int count = 0;
    Scanner sc = new Scanner(new StringReader(text));
    long start = System.nanoTime();

    while (sc.hasNextLine()) {
        sc.nextLine();
        count++;
    }

    long time = System.nanoTime() - start;
    System.out.printf("Scanner nextLine took an average of %,d ns count=%,d%n", time / count, count);
}

最終的に印刷

BufferedReader.readLine() took an average of 124 ns count=10,000
Scanner nextLine took an average of 1,549 ns count=10,000

相対的な差は大きいですが、スキャナーはそれぞれ数マイクロ秒未満です。

于 2012-09-12T12:42:24.597 に答える
0

スキャナー - そのメソッドの多くは、入力ストリームをトークンに解析するという考え方です。BufferedReader は、入力をトークンに分割することに依存しません。必要に応じて、文字単位で読み取ることができます。行全体を読み取ることができ、やりたいことを実行できます。それにスキャナー。BufferedReader が実行できるすべてのことを、同じレベルの効率で実行できます。ただし、さらに Scanner は、正規表現を使用してプリミティブ型と文字列の基になるストリームを解析できます。また、選択した区切り文字で基になるストリームをトークン化することもできます。また、デリミタを無視して、基になるストリームを順方向にスキャンすることもできます!

編集 言及する のを忘れてください...「ただし、スキャナーはスレッドセーフではありません。外部で同期する必要があります。」

于 2012-09-12T12:34:40.717 に答える
0

ここに と の違いがjava.lang.util.scannerありjava.lang.util buffered readerます。どちらも Java クラスでユーザーからの入力を取得するのに役立ちますが、理解する必要がある大きな違いがあります。

Scanner は、デフォルトの区切り文字として空白を使用する単一トークン入力システムです。他のさまざまな方法を使用して、これを他の形式に変更できますが。

バッファ付きリーダーはバッファ付き入力システムですが。データのチャンク (ストリーム) を受け取り、ユーザーが保存したいデータ型にフィードします。したがって、フラッシュするかバッファーがいっぱいになるまで、リーダー ストリームはデータを提供しません。

于 2012-09-12T13:14:43.747 に答える