在Scanner
处理输入时,类型出奇地不一致。它吞下 I/O 异常——消费者应该明确地测试这些异常——所以它在通知读者错误方面是松懈的。但是在解码字符数据时类型是严格的 - 错误编码的文本或使用错误的编码将导致引发 an IOException
,类型会迅速吞下。
此代码通过错误检查读取文本文件中的所有行:
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 语法,未经测试。