【问题标题】:Issue in reading a file with Scanner使用 Scanner 读取文件时出现问题
【发布时间】:2016-04-21 09:18:13
【问题描述】:

这是一个非常简单的任务,我已经做过很多次了。但是,目前,我被这行代码卡住了。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Test {

private static Scanner scan;

  public static void main(String[] args) throws FileNotFoundException {
    // TODO Auto-generated method stub
    File file = null;
    switch (1) {
    case 1:
        file = new File("W:\\Umesoft Evobus\\From AQUA\\Aqua data_ All\\20090101-20090630_datenabzug_tilde.txt");
        break;
    case 2:
        file = new File("W:\\Umesoft Evobus\\From AQUA\\Aqua data_ All\\20090701-20091231_datenabzug_tilde.txt");
        break;
    }
    scan = new Scanner(file);
    String x = scan.nextLine();
    System.out.println(x);
  }

}

当我尝试读取第一个文件时,我得到了 NoSuchElementException。当我尝试读取第二个文件时,我没有问题。这两个文件来自相同的来源并具有相同的格式。我敢肯定,输入文件没有问题。两个文件的第一行完全相同。

谁能解释一下这种情况?

以上程序仅用于测试。因此,我使用了 switch case 来选择文件。

在实际程序中,一组文件是由用户选择的。并且每次都会跳过这个文件。输入文件是通过另一个程序生成的数据文件。它们与 CSV 文件非常相似,但出于某些原因,此处使用的分隔符是 ~。它们不能为空,因为即使在最坏的情况下,它们也会有标题。

Screenshot of the file contents in notepad++:

文件 1 的输出:

Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at controller.Test.main(Test.java:24)

文件 2 的输出:

Weltherstellercode~FIN~Fahrzeug_Baumuster~~Motoridentnummer~Getriebe_Identifizierungsnummer~Produktionsdatum~Produktionsnummer_Fzg~Erstzulassungsdatum~Reparaturdatum~Fahrzeug_Laufleistung_in_km~Interne_VEGA_Antragsnummer~TGA~Fehlerort~~Fehlerart~~Reparaturart~~Hauptschadensteil~Reparaturland_(G&K)~~Reparaturbetrieb_(G&K)~~Mitteilungstext~Gutschriftsdatum_(Summe)~Anzahl_Beanstandungen~Gesamtkosten~Lohnkosten~Materialkosten~Summe_DH+NK~Anzahl_Arbeitswerte_(Gutgeschrieben)                                                                      

【问题讨论】:

  • 你确定第一行没有不可打印的字符吗?
  • JavaDoc 说:@throws NoSuchElementException if no line was found
  • 为什么你甚至有一个开关盒两种情况都会导致相同的输出
  • @npinti 是的。我也在记事本++中检查了这一点
  • @Priyamal 开关盒仅用于测试目的。 1 与第一个文件一起运行。 2 与第二个一起运行。这是一个用于测试的 sn-p。不是实际的程序本身。

标签: java file java.util.scanner nosuchelementexception


【解决方案1】:
       String line ="";
       BufferedReader br = new BufferedReader(new FileReader("path"));
       while ((line = br.readLine()) != null) {
       System.out.println(line);            
       }

以来,我将之前的代码更改为使用缓冲阅读器

BufferedReader 的缓冲内存比 Scanner 大得多。 如果您想从流中获取长字符串,请使用 BufferedReader,并且 如果要从流中解析特定类型的令牌,请使用 Scanner

【讨论】:

  • 这样可以避免异常。但是,我无法读取该文件。我强制程序读取文件,因为在我的实际程序中,文件是由用户通过 GUI 选择的。它是一个数据文件,第一行应该包含标题。由于这些是从另一个程序生成的,因此无论数据是否存在,标题都肯定存在。
  • 如果它避免了异常,但在某些时候它会打印出你的行吗?
  • 请查看我添加的屏幕截图。我知道这听起来很愚蠢。
  • 我不想使用 BufferedReader。不过,它与它一起工作。我确实从另一个帖子中找到了解决方案。
【解决方案2】:

来自不同帖子的以下答案有效。

https://stackoverflow.com/a/35173548/6234625

scan = new Scanner(file,"UTF-8");

我不得不提到扫描仪的编码。

感谢所有试图帮助我的人。特别感谢@Abhsheik 和@Priyamal。

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2021-04-09
    • 2019-03-07
    相关资源
    最近更新 更多