2017-04-10 2 views
-3

Ich habe ähnliche Themen gesehen, aber ich kann nicht scheinen, eine funktionierende Lösung zusammenzubauen. Ich schreibe ein Programm, das (teilweise) Werte von stdin liest, um einige Operationen auszuführen. Ich beabsichtige jedoch, die Eingabe aus einer Textdatei zur Laufzeit umzuleiten, sodass ich nicht einfach ein EOF mit Strg + Z (Windows) ausgeben kann.Java-Scanner hasNextLine() Blockierung Problem

String s; 
    int v2 = 0; 
    double w = 0; 
    int v1 = 0; 
    int i = 0; 
    Scanner sc = new Scanner(System.in); 
    while(sc.hasNextLine()){ 
     s = sc.nextLine(); 
     String[] arr = s.trim().split("\\s+"); 

     v1 = Integer.parseInt(arr[0]); 
     v2 = Integer.parseInt(arr[1]); 
     w = Double.parseDouble(arr[2]); 

     i++; 
    } 
    System.out.println(i); 
    sc.close(); 

Ich kann nie auf die endgültige Druck Erklärung zu bekommen scheinen, wie (meine Vermutung sowieso) scheint es hasNextLine() auf unbestimmte Zeit blockiert. Hier

ist ein Beispiel für das Format der Eingabedatei:

0 1 5.0 
1 2 5.0 
2 3 5.0 
3 4 5.0 
4 5 5.0 
12 13 5.0 
13 14 5.0 
14 15 5.0 
... 
-1 

Es ist immer im Format int int double, aber der Abstand zwischen variieren kann, damit die String-Operationen. Es endet auch immer mit -1.

Ich habe die folgenden ohne Erfolg

String s; 
int v2 = 0; 
double w = 0; 
int v1 = 0; 
int i = 0; 
Scanner sc = new Scanner(System.in); 
while(sc.hasNextLine()){ 
    s = sc.nextLine(); 
    String[] arr = s.trim().split("\\s+"); 

    v1 = Integer.parseInt(arr[0]); 
    if(v1 < 0){ 
     break; 
    } 
    v2 = Integer.parseInt(arr[1]); 
    w = Double.parseDouble(arr[2]); 

    i++; 
} 
System.out.println(i); 
sc.close(); 

Ich habe die meisten den Code links ausprobiert, die nicht relevant ist Unordnung zu vermeiden. Ich kann bei Bedarf posten.

Vielen Dank für einen Blick.

EDIT: Für die Klarheit bearbeitet. Beachten Sie auch, dass es unabhängig vom Zeileninhalt in der letzten Zeile der Eingabedatei hängt (dh gültige Zeilen hängen). Ich leite über Eclipse (Neon) um.

+0

Mögliches Duplikat [Wie aus while-Schleife in Java mit Scanner-Methode "hasNext" als Bedingung zu bekommen?] (Http://stackoverflow.com/questions/10490344/how-to-get-out- while-in-java-mit-scanner-methode-hasnext-als-bedingung) – Tom

+0

Entschuldigung, ich habe eine andere Version des Codes verwendet, in dem ich versucht habe, hasNextLine() zu umgehen. Ich habe auch den Thread gesehen, den Sie erwähnt haben, und versucht, diese Lösung zu implementieren, aber es hat nicht funktioniert, was zu dem Verdacht führte, dass das Problem variieren könnte. –

+0

Und wie sieht * "versucht, diese Lösung zu implementieren" *? – Tom

Antwort

0

Ihr Code scheint gut zu funktionieren. Sie können zwar nach hasNextLine suchen und nach anderen Bedingungen suchen, wenn EOF angepasst wird (wie in Ihrem Fall gibt es -1). Sie können auch einige Ausnahmen bemerken, wenn Ihr Code für sie anfällig ist. Unten Code funktionierte gut für mich.

 Scanner scanner = new Scanner(new File("/opt/test.txt")); 
     int secondValue = 0; 
     double lastValue = 0; 
     int firstValue = 0; 
     int LineNumber = 0; 
     while ((scanner.hasNextLine())) { 
      try { 

       String[] arr = scanner.nextLine().trim().split("\\s+"); 

       firstValue = Integer.parseInt(arr[0]); 
       secondValue = Integer.parseInt(arr[1]); 
       lastValue = Double.parseDouble(arr[2]); 
       doSomeThing(firstValue,secondValue,lastValue); 

       LineNumber++; 
      } catch (Exception excep) { 

      } 
     } 
     System.out.println(LineNumber); 
} 
+0

Danke fürs Testen. Ich wette dann, dass es eine Eigenart in Eclipse ist (oder eine seltsame Einstellung, die ich auf meinem System habe). –

+0

Gelöscht mein Kommentar, wegen Tom's Typo .. –

+1

Ohh bemerkte gerade meine zwei nextLine ... Danke Tom –