我有一堆.txt文件,我试图阅读,但对于他们中的许多人,他们不会阅读。那些不会读取的内容似乎以文本前的空白行开头。例如,以下内容抛出NoSuchElementException:
public static void main(String[] args) throws FileNotFoundException{
Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
System.out.println(input.next());
}
正在读取的文本文件以空行开头,然后是一些文本。我也尝试使用input.skip(“[\\ s] *”)跳过任何前导空格,但它会抛出相同的错误。有办法解决这个问题吗?
编辑: 谷歌文档中托管的file。如果你下载到文本编辑器中查看,你可以看到它开头的空行。
答案 0 :(得分:3)
在处理输入时,Scanner
类型非常不一致。它吞没了I / O异常 - 消费者应该test for these explicitly - 因此在告知读者错误方面不严谨。但是在解码字符数据时类型是严格的 - 错误编码的文本或使用错误的编码将导致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;
}
这两种方法都要求您明确提供encoding,而不是依赖通常不是Unicode的default encoding(另请参阅standard constants。)
代码是Java 7语法,未经测试。
答案 1 :(得分:1)
它以空行开头,您只打印代码中的第一行,将其更改为:
public static void main(String[] args) throws FileNotFoundException{
Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
while(input.hasNextLine()){
System.out.println(input.nextLine());
}
}
答案 2 :(得分:0)
扫描仪读取直到行尾的所有单词或数字。此时你需要调用nextLine()。如果你想避免得到一个Exception,你需要调用一个hasNextXxxx()方法来确定是否可以读取该类型。