webentwicklung-frage-antwort-db.com.de

Zeile mit Scanner lesen

EDIT für weitere Leser: Das Problem war, dass meine Eingabedatei beschädigt war.

Ich verstehe nicht was ich falsch mache:

Ich habe diesen Code verwendet:

    File f = new File("C:\\Temp\\dico.txt");
    BufferedReader r = null;
    try {
        r = new BufferedReader(new FileReader(f));
        String scan;
        while((scan=r.readLine())!=null) {
            if(scan.length()==0) {continue;}
            //treatment
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if(r!=null) try {
            r.close();
        } catch (IOException ex) {
            Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Welches funktioniert gut. Aus irgendeinem Grund wollte ich jetzt für einen Scanner wechseln. Mein Code wurde:

    File f = new File("C:\\Temp\\dico.txt");
    Scanner r = null;
    try {
        r = new Scanner(f);
        String scan;
        while(r.hasNextLine()) {
            scan = r.nextLine();
            if(scan.length()==0) {continue;}
            //treatment
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if(r!=null) r.close();
    }

Diesmal geben wir niemals das while ein, weil r.hasNextLine () immer "false" zurückgibt. Irgendeine Idee, was ich falsch mache?

Ich präzisiere, dass sich nichts anderes geändert hat, die Datei ist immer noch gleich.

BEARBEITEN : Ich habe auch genau gesagt, dass ich es mit einer anderen Datei probiert habe und dasselbe Ergebnis habe, was bedeutet, dass es anscheinend nicht aus der Datei stammt.

Die Datei sieht so aus:

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait
...

Edit 2:Der Inhalt der Datei scheint problematisch zu sein, da das Problem nur dann besteht, wenn ich den Inhalt aus meiner Datei in eine andere kopiere. Wenn ich den Inhalt selbst schreibe, funktioniert es, wenn ich einen Teil des Inhalts meiner dico.txt-Datei verwende, funktioniert es nicht. Irgendeine erklärung?

Bearbeiten Sie 3:Dies sind die Links zu meinen Dateien. Ich empfehle Ihnen, die dico.txt zu vermeiden, die sehr groß ist.

dico.txt: https://drive.google.com/file/d/0B0sroFy9HZlBNDl3MUwzVnh6VU0/edit?usp=sharing

test.txt: https://drive.google.com/file/d/0B0sroFy9HZlBemZjbXU1RmlmdjQ/edit?usp=sharing

24
Sharcoux

Dieser Code liest die Datei Zeile für Zeile.

public static void readFileByLine(String fileName) {
  try {
   File file = new File(fileName);
   Scanner scanner = new Scanner(file);
   while (scanner.hasNext()) {
    System.out.println(scanner.next());
   }
   scanner.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } 
 }

Sie können auch ein Trennzeichen als Zeilentrennzeichen festlegen und dann dasselbe durchführen.

 scanner.useDelimiter(System.getProperty("line.separator"));

Sie müssen prüfen, ob ein nächstes Token verfügbar ist, und dann das nächste Token lesen. Sie müssen auch die Eingabe des Scanners überprüfen. dico.txt. Standardmäßig bricht der Scanner seine Eingabe basierend auf Leerzeichen. Stellen Sie sicher, dass die Eingabe die Trennzeichen an der richtigen Stelle hat

AKTUALISIERTE ANTWORT für Ihren Kommentar:

Ich habe gerade versucht, eine Eingabedatei mit dem folgenden Inhalt zu erstellen

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait

ich habe versucht, es mit dem Code unten zu lesen.

 File file = new File("/home/keerthivasan/Desktop/input.txt");
     Scanner scr = null;
         try {
            scr = new Scanner(file);
            while(scr.hasNext()){
                System.out.println("line : "+scr.next());
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ScannerTest.class.getName()).log(Level.SEVERE, null, ex);
        }

Ausgabe:

line : a
line : à
line : abaissa
line : abaissable
line : abaissables
line : abaissai
line : abaissaient
line : abaissais
line : abaissait

ich bin mir also sicher, dass dies funktionieren sollte. Da Sie in der Windows-Umgebung arbeiten, besteht die EOL-Sequenz (0x0D 0x0A,\r\n) aus zwei Zeilen ASCII, einer Kombination aus CR und LF. Wenn Sie Ihre Scanner-Instanz so einstellen, dass der Begrenzer wie folgt verwendet wird, wird er wahrscheinlich angehoben

 scr = new Scanner(file);
 scr.useDelimiter("\r\n");

und machen Sie dann Ihre Schleife, um Zeilen zu lesen. Hoffe das hilft!

16
Keerthivasan

next () - und nextLine () - Methoden sind mit Scanner verbunden und werden zum Abrufen von String-Eingaben verwendet. Ihre Unterschiede sind ...

next () kann die Eingabe nur bis zum Leerzeichen lesen. Es kann nicht zwei durch Leerzeichen getrennte Wörter lesen. Next () setzt den Cursor nach dem Lesen der Eingabe in dieselbe Zeile.

nextLine () liest die Eingabe einschließlich Leerzeichen zwischen den Wörtern (dh sie liest bis zum Zeilenende\n). Sobald die Eingabe gelesen wurde, positioniert nextLine () den Cursor in der nächsten Zeile.

Artikel lesen: Unterschied zwischen next () und nextLine ()

Ersetzen Sie Ihre while-Schleife durch:

while(r.hasNext()) {
                scan = r.next();
                System.out.println(scan);
                if(scan.length()==0) {continue;}
                //treatment
            }

Durch Verwendung der Methoden hasNext() und next() wird das Problem behoben.

5
Nishant Lakhara
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import Java.io.File;
import Java.util.Scanner;

/**
 *
 * @author zsagga
 */
class openFile {
        private Scanner x ; 
        int count = 0 ; 
        String path = "C:\\Users\\zsagga\\Documents\\NetBeansProjects\\JavaApplication1\\src\\javaapplication1\\Readthis.txt"; 


    public void openFile() {
//                System.out.println("I'm Here");
        try {
            x = new Scanner(new File(path)); 

        } 
        catch (Exception e) {
            System.out.println("Could not find a file");
        }
    }

    public void readFile() {

        while (x.hasNextLine()){
            count ++ ;
            x.nextLine();     
        }
        System.out.println(count);
    }

    public void closeFile() {
        x.close();
    }
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

/**
 *
 * @author zsagga
 */
public class JavaApplication1 {

    public static void main(String[] args) {
        // TODO code application logic here
        openFile r =  new openFile(); 
        r.openFile(); 
        r.readFile();
        r.closeFile(); 

    }
}
1
Zuhair Sagga

Für alle, die noch keine einfache TXT-Datei mit dem Java-Scanner einlesen können.


Ich hatte das Problem, dass der Scanner in der nächsten Zeile nicht lesen konnte, wenn ich die Informationen kopierte und einfügen oder wenn zu viel Text in meiner Datei war.

Die Lösung lautet: Codieren Sie Ihre TXT-Datei in UTF-8.
Dies kann relativ einfach durchgeführt werden, indem Sie die Datei erneut speichern und die Kodierung in UTF-8 ändern. (Unter Win7 in der rechten unteren Ecke)

Der Scanner sollte danach kein Problem haben.

Verwenden Sie r.hasNext () anstelle von r.hasNextLine () :

while(r.hasNext()) {
        scan = r.next();
0
yuvalhuck