このブログを検索

9.23.2010

[Java]Scanner VS BufferedReader

ファイル入力の際にいつもBufferedReaderクラスしか使ったことなかったですが,
ふとしたときにScannerクラスの存在を知ったので,
違いと個々の使い分け法記します.

また,説明する際に使用するテキストファイル内容は
test.txt
Hello World
1 2 3
おはよう!
を使用します.

・BufferedReaderクラス使用
コード例
try {
   BufferedReader in = new BufferedReader(new FileReader(textAd));
   String line;
   while ((line = in.readLine()) != null) {
    System.out.println(line);
   }
   in.close();
  } catch (IOException er) {
   System.out.println(er.getMessage());
  }

・Scannerクラス使用
try {
   File file = new File(textAd);
   Scanner ScanFile = new Scanner(file);
   while (ScanFile.hasNextLine()) {
    System.out.println(ScanFile.nextLine());
   }
   ScanFile.close();
  } catch (IOException er) {
   System.out.println(er.getMessage());
  }

上記のプログラムを個々に100回繰り返した時の時間を比較したところ,
BufferedReaderクラス : 0.015秒
Scannerクラス     : 0.062秒

Scannerクラスのほうが遅いことがわかる.
では,Scannerクラスを利用するメリットはないかといえば,そうではありません.

メリット1 キーボード入力
  Scanner scan = new Scanner(System.in);
  String line = scan.next();
  System.out.println(line);
  line = scan.next();
  System.out.println(line);
実行結果(入力: hello world)
hello
world

メリット2 型指定キーボード入力
  int line = scan.nextInt();
  System.out.println(line);
  line = scan.nextInt();
  System.out.println(line);

実行結果(入力:123 456
123
456

以上のようにBufferedReaderを使用した場合、よりScannerを利用した方がコードは簡潔にすることが可能です。
暗黙的に2つに分けると決めていたのですが、実際使用する場合は、
  while (scan.hasNextInt()) {
   int line = scan.nextInt();
   System.out.println(line);
  }
と、書くといいかもしれません。
また、使用する際はExceptionが発生した場合に対処するためtry文なりthrowなりで対策する必要があります。

参考資料
Scanner
BufferedReader

0 件のコメント:

コメントを投稿