1. 概要

この記事では、 Java のBufferedReader、Console、Scannerクラスの違いについて説明します。

各トピックについて詳しく知るには、 JavaスキャナーJavaのコンソールI/O、およびBufferedReaderに関する個々の記事を参照することをお勧めします。

2. ユーザー入力

コンストラクターに渡される基になるストリームを考えると、 BufferedReaderクラスとScannerクラスの両方が、文字列、ファイル、システムコンソール(通常はキーボードに接続されている)など、より広範囲のユーザー入力を処理できます。とソケット。

一方、 Console クラスは、現在のJava仮想マシンに関連付けられている文字ベースのシステムコンソール(存在する場合)にのみアクセスするように設計されています。

さまざまな入力を受け入れるBufferedReaderコンストラクターを見てみましょう。

BufferedReader br = new BufferedReader(
  new StringReader("Bufferedreader vs Console vs Scanner in Java"));
BufferedReader br = new BufferedReader(
  new FileReader("file.txt"));
BufferedReader br = new BufferedReader(
  new InputStreamReader(System.in))

Socket socket = new Socket(hostName, portNumber);
BufferedReader br =  new BufferedReader(
  new InputStreamReader(socket.getInputStream()));

Scanner クラスも同様に、コンストラクターでさまざまな入力を受け入れることができます。

Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java")
Scanner sc = new Scanner(new File("file.txt"));
Scanner sc = new Scanner(System.in);

Socket socket = new Socket(hostName, portNumber);
Scanner sc =  new Scanner(socket.getInputStream());

Console クラスは、メソッド呼び出しを介してのみ使用できます。

Console console = System.console();

Console クラスを使用する場合、EclipseやIntelliJ IDEAなどのIDE内でコードを実行すると、JVM関連のシステムコンソールを使用できないことに注意してください。

3. ユーザー出力

出力ストリームに何も書き込まないBufferedReaderおよびScannerクラスとは対照的に、Consoleクラスは readPassword(String fmt、Object…args)、readLine(String fmt 、Object…args)、および printf(String format、Object…args)は、プロンプトをシステムコンソールの出力ストリームに書き込みます。

String firstName = console.readLine("Enter your first name please: ");
console.printf("Welcome " + firstName );

したがって、システムコンソールと対話するプログラムを作成する場合、 Console クラスは、不要な System.out.println を削除することにより、コードを簡素化します。

4. 入力の解析

Scannerクラスは、正規表現を使用してプリミティブ型と文字列を解析できます

カスタム区切り文字パターンを使用して、入力をトークンに分割します。これは、デフォルトで空白に一致します。

String input = "Bufferedreader vs Console vs Scanner";
Scanner sc = new Scanner(input).useDelimiter("\\s*vs\\s*");
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());
sc.close();

BufferredReaderおよびConsoleクラスは、入力ストリームをそのまま読み取るだけです。

5. 安全なデータの読み取り

Console クラスには、エコーを無効にして安全なデータを読み取るためのメソッド readPassword()および readPassword(String fmt 、Object…args)があります。そのため、ユーザーは入力内容が表示されません。

String password = String.valueOf(console.readPassword("Password :"));

BufferedReaderおよびScannerにはその機能がありません。

6. スレッドセーフ

BufferedReaderの読み取りメソッドとConsole の読み取りおよび書き込みメソッドはすべて同期ですが、Scannerクラスのメソッドはそうではありません。 マルチスレッドプログラムでユーザー入力を読み取る場合は、BufferedReaderまたはConsoleのいずれかがより適切なオプションになります。

7. バッファサイズ

スキャナークラスの1KBと比較して、BufferedReaderのバッファサイズは8KBです。

さらに、必要に応じて、BufferedReaderクラスのコンストラクターでバッファーサイズを指定できます。 これは、ユーザー入力から長い文字列を読み取るときに役立ちます。 コンソールクラスには、システムコンソールからの読み取り時にバッファがありませんが、システムコンソールに書き込むためのバッファリングされた出力ストリームがあります。

8. その他

さまざまな状況で使用する適切なクラスを選択するときに考慮する主な要因ではないいくつかの違いがあります。

8.1. 入力ストリームを閉じる

BufferedReaderまたはScannerのインスタンスを作成したら、メモリリークを回避するために、忘れずに閉じる必要があります。 ただし、これは Console クラスでは発生しません。使用後に、システムコンソールを閉じる必要はありません。

8.2. 例外処理

ScannerConsoleはチェックされていない例外アプローチを採用していますが、 BufferedReader のメソッドはチェックされた例外をスローします。これにより、例外を処理するための定型的なtry-catch構文を作成する必要があります。 。

9. 結論

これらのクラスの違いについて説明したので、さまざまな状況に取り組むのに最適な経験則をいくつか考えてみましょう

  • スキャナーよりもパフォーマンスが優れているため、ファイルから長い文字列を読み取る必要がある場合は、BufferedReaderを使用してください。
  • システムコンソールから安全なデータを読み取っていて、入力されている内容を非表示にする場合は、Consoleを検討してください。
  • カスタム正規表現を使用して入力ストリームを解析する必要がある場合は、Scannerを使用します
  • スキャナーは、入力ストリームを読み取って解析するためのきめ細かいメソッドを提供するため、システムコンソールと対話するときに推奨されます。 さらに、ほとんどの場合、 nextXXX メソッドがブロックされ、手動入力を待機するため、パフォーマンスの欠点は大きな問題ではありません。
  • スレッドセーフなコンテキストでは、 Console クラスに固有の機能を使用する必要がない限り、BufferedReaderを検討してください。