1.概要

この記事では、** Javaの

BufferedReader



Console

、および

Scanner

の各クラスの違いについて説明します。

各トピックについて深く掘り下げるには、https://www.baeldung.com/java-scanner[Java Scanner]、https://www.baeldung.com/java-consoleの各記事をご覧ください。 -input-output[JavaのコンソールI/O]、およびhttps://www.baeldung.com/java-buffered-reader[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(文字列フォーマット、オブジェクト…​

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

のreadメソッドと

Console

のreadメソッドおよびwriteメソッドはすべて

synchronized

ですが、

Scanner

クラスのメソッドはそうではありません。 ** マルチスレッドプログラムでユーザー入力を読む場合は、

BufferedReader

または

Console

のいずれかを選択することをお勧めします。

7.バッファサイズ


  • Scanner

    クラスの1 KBと比較して、

    BufferedReader

    のバッファサイズは8 KBです。

さらに、必要に応じてBufferedReaderクラスのコンストラクタでバッファサイズを指定できます。これは、ユーザー入力から長い文字列を読み取るときに役立ちます。


Console

クラスはシステムコンソールから読み込むときにバッファを持ちません

が、システムコンソールに書き込むための出力ストリームをバッファしています。

8.その他

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

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


BufferedReader

または

Scanner

のインスタンスを作成したら、メモリリークを回避するために** それを閉じることを忘れないでください。しかし、これは

Console

クラスでは起こりません – 使用後にシステムコンソールを閉じる必要はありません。

8.2. 例外処理


Scanner



Console

は未チェックの例外アプローチを採用していますが、

BufferedReader

のメソッドはチェック例外をスローするため、例外を処理するための定型的なtry-catch構文を記述する必要があります。

9.まとめ

これらのクラスの違いについて説明したので、次に、さまざまな状況に対処するのに最適なルールについて考えます。

  • ファイルから長い文字列を読み込む必要がある場合は、

    BufferedReader

    を使用します。


Scanner

よりもパフォーマンスが優れています
** システムから安全なデータを読み取る場合は、

Console

を検討してください。

入力した内容を隠したい
** 入力ストリームをカスタムで解析する必要がある場合は

Scanner

を使用してください。

正規表現
システムコンソールと対話するときは**

Scanner

が優先されます。

入力ストリームを読み込んで解析するためのきめ細かいメソッドが用意されているため。に
さらに、パフォーマンスの欠点は、ほとんどの場合と同様、大きな問題ではありません。
場合によっては、

nextXXX

メソッドがブロックされ、手動入力を待つ
** スレッドセーフなコンテキストでは、必要がない限り

BufferedReader

を検討してください。


Console

クラスに固有の機能を使用する