コーディング初心者あるある。
「Scanner,BufferedReaderのどちらを使えばいいかわからない!」
って題材で書いていく。
①'Scanner'クラスについて
特徴
1.簡単な入力処理が可能
2.close処理が必要
以下に例を記載する。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter an integer:");
int n = scanner.nextInt();
System.out.println("Enter a string:");
String str = scanner.next();
System.out.println("You entered: " + n + " and " + str);
//最後にclose処理が必要!
scanner.close();
}
}
上記のようにScannerクラスを使用すると処理を終了する前で
scanner.close();
を書く必要があります。
JavaSilever勉強中の方であれば、
try-catch-finally構文もclose処理が必要で閉じ忘れがめんどくさいから、
try-with-resource構文を使うようなイメージかな。
結論
scannerクラスは実装が短く済む一方で、close処理が必要だから気を使いましょう。
②'BufferedReader'クラス
特徴
1.大量のテキストデータを効率的に読み取ることができる。
2.BufferedReadearはInputStreamReaderと組み合わせて使用する。
実際に例を見てみよう。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
try { //まずtry-with-resource構文の形式で書く。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter an integer:");
int n = Integer.parseInt(reader.readLine());
System.out.println("Enter a string:");
String str = reader.readLine();
System.out.println("You entered: " + n + " and " + str);
} catch (IOException e) { //最後にcatchする。
e.printStackTrace(); //エラー処理
}
}
}
あれ、なのでBufferedReaderとInputStreamReaderどちらも必要なんだ?
って思いませんか?(←僕は昔思いました)
その理由としてそれぞれのクラスの役割と流れを知りましょう。
InputStreamReader:バイトストリームを文字ストリームに変換する。
BufferedReader:InputStreamReaderをラップ(※1)してバッファリングを行い、効率的な読み取りを実現する。
。
ラップは感覚としてはチェーンメソッド的な感じです↓
BufferedReader br = new BufferedReader(isr); //isrはInputStreamReaderの変数
つまり、上記の二つのクラスを使うことで、効率的に文字入力ストリームを処理することができるのです。効率的というのは、readLine()メソッドを使ってシンプルに高速に処理できるという意味。
最終的にどっちが使い勝手いいんですか!(怒)
回答:どちらもメリットデメリットあるので下記を見て使いやすい方で使い分けてください。
BufferedReaderを使うべき場合
①大量のデータを高速に読み取る必要がある場合:BufferedReaderはバッファリングにより、効率的な読み取りが可能。
②一行単位での読み取りが中心の場合:readLine()メソッドで一行ずつ読み取るのが簡単。
③細かい制御が必要な場合:低レベルの操作や特殊な入出力処理が必要なときに向いている。
Scannerを使うべき場合
①ユーザー入力の解析が必要な場合:整数、浮動小数点数、文字列などのプリミティブデータ型を簡単に読み取ることができる。
②トークン単位での入力分割が必要な場合:nextInt(), nextLine()などのメソッドを使って入力をトークンに分割できます。
③正規表現による入力のパターンマッチングが必要な場合:入力を特定のパターンに基づいて分割することができる。
まとめ
シンプルかつ効率的な一行単位の入力にはBufferedReader。
多様なデータ型の入力解析やトークン単位の分割が必要な場合にはScanner。
以上、ご覧いただきありがとうございました。