JavaにおけるBufferedReaderとConsoleとScanner
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
クラスに固有の機能を使用する