繁体   English   中英

扫描仪无法读取文本文件

[英]Scanner unable to read text file

我有一堆.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] *”)跳过任何前导空格,但它会抛出相同的错误。 有办法解决这个问题吗?

编辑: 文件托管在谷歌文档。 如果您下载到文本编辑器中查看,您可以看到它开头的空行。

在处理输入时, Scanner类型非常不一致。 它吞没了I / O异常 - 消费者应该明确地测试它们 - 所以它在向读者通知错误方面是松懈的。 但是在解码字符数据时类型是严格的 - 错误编码的文本或使用错误的编码将导致引发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语法,未经测试。

它以空行开头,您只打印代码中的第一行,将其更改为:

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());
    }
}

扫描仪读取直到行尾的所有单词或数字。 此时你需要调用nextLine()。 如果要避免出现异常,则需要调用其中一个hasNextXxxx()方法来确定是否可以读取该类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM