Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのScannerクラスとBufferedReaderクラスの違いを徹底比較

Javaでは、キーボード入力やファイルなど外部システムからデータを読み込む際に、ScannerクラスとBufferedReaderクラスのどちらも利用できます。Scannerは、入力が文字列型やプリミティブ型であることがあらかじめ分かっている場合に主に使われるクラスです。一方、BufferedReaderは、文字ストリームからテキストを読み込む際にバッファリングを行うことで、効率的に文字を読み取るためのクラスです。

ここでは、ScannerクラスとBufferedReaderクラスの重要な違いを5つの観点から比較します。

番号項目ScannerクラスBufferedReaderクラス
1同期性
非同期(スレッドセーフではない)ため、シングルスレッド環境でのみ使用すべきです。
同期的(スレッドセーフ)です。マルチスレッド環境ではBufferedReaderを使用するのが適切です。
2バッファメモリ
約1KBの小さな文字バッファを持ちます。
Scannerと比べて大きな8KBのバイトバッファを持ちます。
3処理速度
読み込んだデータの解析(パース)も行う必要があるため、やや低速です。
文字ストリームの読み込みのみを行うため、Scannerよりも高速です。
4メソッド
nextInt()、nextShort()など、型ごとの読み込みメソッドが用意されています。
readLine()で取得した文字列を、Integer.parseInt()やShort.parseShort()などのラッパークラスのメソッドで変換して使います。
5行の読み込み
nextLine()メソッドで1行ずつ読み込みます。
readLine()メソッドで1行ずつ読み込みます。

ScannerとBufferedReaderの使用例

次のサンプルコードでは、BufferedReaderとScannerの両方を使って、標準入力から整数を読み込んでいます。

JavaTester.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class JavaTester {
    public static void main(String args[]) throws NumberFormatException, IOException {
        BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter an number:");
        int a = Integer.parseInt(bufferReader.readLine());
        System.out.printf("You entered: " + a);
        Scanner scanner = new Scanner(System.in);
        System.out.println("\nEnter an number:");
        a = scanner.nextInt();
        System.out.printf("You entered: " + a);
    }
}

実行結果

Enter an number:
1
You entered: 1
Enter an number:
2
You entered: 2

このように、手軽に型付きの入力を受け取りたい場合はScannerが便利ですが、パフォーマンスやマルチスレッド対応が求められる場面ではBufferedReaderを選ぶのが一般的です。用途に応じて適切なクラスを使い分けましょう。

  1. Javaにおけるシリアライズ(Serializable)と外部化(Externalizable)の違いを徹底解説

    Javaのシリアライズ(直列化)と外部化(Externalizable)は、どちらもオブジェクトをバイトストリームに変換し、そのバイトストリームをデータベースやメモリに保存するための仕組みです。java.io.Serializableインターフェースを実装したクラスは自動的にシリアライズ可能となります。一方、外部化はアプリケーションの要件に応じてカスタマイズされたシリアライズを行いたい場合に使用され、Externalizableインターフェースはjava.io.Serializableを継承しています。以下の表に、両者の主な違いをまとめました。No.比較項目シリアライズ(Serializabl

  2. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati