2016-04-21 9 views
1

Dies ist eine ziemlich einfache Aufgabe, und ich habe dies oft getan. Aber im Moment stecke ich an dieser trivialen Codezeile fest.Problem beim Lesen einer Datei mit Scanner

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

} 

Wenn ich versuche, die erste Datei zu lesen, bekomme ich eine NoSuchElementException. Wenn ich versuche, die zweite Datei zu lesen, habe ich keine Probleme. Beide Dateien stammen aus derselben Quelle und haben dasselbe Format. Ich bin sicher, es gibt keine Probleme in Bezug auf die Eingabedateien. Die erste Zeile in beiden Dateien ist identisch.

Kann jemand diese Situation erklären?

Das obige Programm dient nur zum Testen. Daher habe ich einen Schalter verwendet, um die Datei auszuwählen.

Im aktuellen Programm wird eine Reihe von Dateien vom Benutzer ausgewählt. Und jedes Mal wird diese Datei übersprungen. Die Eingabedateien sind Datendateien, die von einem anderen Programm generiert werden. Sie sind CSV-Dateien sehr ähnlich, aber das hier verwendete Trennzeichen ist ~ aus bestimmten Gründen. Sie können nicht leer sein, denn selbst im schlimmsten Fall würden sie Header haben.

Screenshot of the file contents in notepad++:

Ausgang für die Datei 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) 

Ausgang für Datei 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)                  
+1

Sind Sie sicher, dass Sie keine nicht druckbaren Zeichen in der ersten Zeile haben? – npinti

+1

JavaDoc sagt: '@throws NoSuchElementException, wenn keine Zeile gefunden wurde ' –

+0

warum haben Sie sogar einen Schalter Fall beide Bedingungen führt zu gleichen Ausgang – Priyamal

Antwort

1

Die folgende Antwort aus einem anderen Beitrag analysieren wollen, gearbeitet.

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

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

Ich hatte die Codierung für den Scanner zu erwähnen.

Danke an alle, die versucht haben, mir zu helfen. Danke besonders an @Abhisheik und @Priyamal.

+0

gute Nachrichten: D ,,, – Priyamal

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

i vorherigen Code verändert, seit

eine gepufferte Leser verwenden

Der BufferedReader hat einen wesentlich größeren Pufferspeicher als der Scanner. Verwenden BufferedReader, wenn Sie lange Ketten aus einem Stream und Verwendung Scanner erhalten möchten, wenn Sie bestimmte Art von Token aus einem Strom

+0

Dies vermeidet die Ausnahme. Aber ich kann die Datei nicht lesen. Ich zwinge das Programm, die Datei zu lesen, weil in meinem tatsächlichen Programm die Datei vom Benutzer über eine GUI ausgewählt wird. Es ist eine Datendatei und die erste Zeile soll die Header enthalten. Da diese von einem anderen Programm erzeugt werden, ob Daten vorhanden sind oder nicht, sind die Header definitiv vorhanden. –

+0

Wenn es die Ausnahme vermeidet, aber wird es irgendwann Ihre Zeile ausdrucken? – Priyamal

+0

Bitte überprüfen Sie den Screenshot, den ich hinzugefügt habe. Ich weiß, das klingt trivial dumm. –