入力の処理に関しては、Scanner
型が奇妙に一貫していません。これは I/O 例外を飲み込みます (消費者はこれらを明示的にテストする必要があります)。そのため、読者にエラーを通知するのは簡単ではありません。しかし、文字データをデコードするときの型は厳密です。正しくエンコードされていないテキストや間違ったエンコーディングを使用するとIOException
、型がすぐに飲み込んでしまう an が発生します。
このコードは、エラー チェックを使用してテキスト ファイル内のすべての行を読み取ります。
public static List<String> readAllLines(File file, Charset encoding)
throws IOException {
List<String> lines = new ArrayList<>();
try (Scanner scanner = new Scanner(file, encoding.name())) {
while (scanner.hasNextLine()) {
lines.add(scanner.nextLine());
}
if (scanner.ioException() != null) {
throw scanner.ioException();
}
}
return lines;
}
このコードは行を読み取り、デコーダーが理解できないコードポイントを疑問符に変換します。
public static List<String> readAllLinesSloppy(File file, Charset encoding)
throws IOException {
List<String> lines = new ArrayList<>();
try (InputStream in = new FileInputStream(file);
Reader reader = new InputStreamReader(in, encoding);
Scanner scanner = new Scanner(reader)) {
while (scanner.hasNextLine()) {
lines.add(scanner.nextLine());
}
if (scanner.ioException() != null) {
throw scanner.ioException();
}
}
return lines;
}
これらの方法は両方とも、多くの場合 Unicode ではないデフォルトのエンコーディングに依存するのではなく、エンコーディングを明示的に提供する必要があります (標準の定数も参照してください)。
コードは Java 7 構文であり、テストされていません。