使用Scanner读取文件时出现问题

时间:2016-04-21 09:18:14

标签: java file java.util.scanner nosuchelementexception

这是一项非常简单的任务,我已经做了很多次。但是,目前,我仍然坚持这条琐碎的代码。

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。当我尝试读取第二个文件时,我没有任何问题。这两个文件来自相同的源并具有相同的格式。我相信,输入文件没有问题。两个文件中的第一行是相同的。

有人可以解释这种情况吗?

以上程序仅供测试。因此,我使用了一个开关盒来选择文件。

在实际程序中,用户选择一组文件。每次都会跳过此文件。输入文件是通过另一个程序生成的数据文件。它们与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)                                                                      

2 个答案:

答案 0 :(得分:1)

       String line ="";
       BufferedReader br = new BufferedReader(new FileReader("path"));
       while ((line = br.readLine()) != null) {
       System.out.println(line);            
       }

我改变了以前的代码以使用缓冲读卡器

  

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

答案 1 :(得分:1)

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

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

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

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

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