web-dev-qa-db-fra.com

Lire la ligne avec le scanner

EDIT pour les lecteurs suivants: le problème était que mon fichier d'entrée était corrompu.

Je ne comprends pas ce que je fais mal:

J'utilisais ce code:

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

Ce qui fonctionne bien. Maintenant, pour une raison quelconque, je voulais changer pour un scanner. Mon code est devenu:

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

Cette fois, nous n'entrons jamais dans le temps, car r.hasNextLine () renvoie toujours "false". Une idée de ce que je fais mal?

Je précise que rien d'autre n'a changé, le fichier est toujours le même.

MODIFIER : Je précise également que j'ai essayé avec un autre fichier et obtenu le même résultat, ce qui signifie que cela ne provient apparemment pas du fichier.

Le fichier ressemble à ceci:

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

Edit 2: Le contenu du fichier semble poser problème car le problème ne persiste que si je copie/colle le contenu de mon fichier dans un autre. En clair, si j’écris moi-même le contenu, cela fonctionne, si j’utilise une partie du contenu de mon fichier dico.txt, cela ne fonctionne pas. Une explication?

Edit 3: Ce sont les liens vers mes fichiers. Je vous conseille d'éviter le dico.txt qui est très énorme.

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

Ce code lit le fichier ligne par ligne.

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

Vous pouvez également définir un délimiteur comme séparateur de ligne, puis procéder de la même manière.

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

Vous devez vérifier si un jeton suivant est disponible, puis lire le jeton suivant. Vous devrez également vérifier deux fois l’entrée donnée au scanner. c'est-à-dire dico.txt. Par défaut, Scanner interrompt sa saisie en fonction des espaces. Veuillez vous assurer que l'entrée a les délimiteurs au bon endroit

RÉPONSE MISE À JOUR pour votre commentaire:

Je viens d'essayer de créer un fichier d'entrée avec le contenu ci-dessous

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait

essayé de le lire avec le code ci-dessous.Il a juste fonctionné bien.

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

Sortie:

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

alors, je suis sûr que cela devrait fonctionner. Puisque vous travaillez dans l'environnement Windows, la séquence de fin de ligne (0x0D 0x0A,\r\n) est en réalité composée de deux caractères ASCII, une combinaison des caractères CR et LF. si vous configurez votre instance Scanner pour utiliser le délimiteur comme suit, elle détectera probablement

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

et ensuite faites votre boucle pour lire les lignes. J'espère que cela t'aides!

16
Keerthivasan

les méthodes next () et nextLine () sont associées à Scanner et sont utilisées pour obtenir des entrées String. Leurs différences sont ...

next () ne peut lire l'entrée que jusqu'à l'espace. Il ne peut pas lire deux mots séparés par un espace. En outre, next () place le curseur sur la même ligne après la lecture de l'entrée.

nextLine () lit les entrées, y compris les espaces entre les mots (c’est-à-dire jusqu’à la fin de la ligne\n). Une fois l'entrée lue, nextLine () positionne le curseur sur la ligne suivante.

Lire l'article: Différence entre next () et nextLine ()

Remplacez votre boucle while par:

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

L'utilisation des méthodes hasNext() et next() résoudra le problème.

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

Pour tous ceux qui ne peuvent toujours pas lire un simple fichier .txt avec le scanner Java.


J'ai eu le problème que le scanner ne pouvait pas lire à la ligne suivante, lorsque je copiais et collais les informations ou qu'il y avait trop de texte dans mon fichier.

La solution est la suivante: Codez votre fichier .txt en UTF-8.
Cela peut être fait assez simplement en enregistrant à nouveau l’ouverture du fichier et en modifiant le codage en UTF-8. (Sous Win7 près du coin inférieur droit)

Le scanner ne devrait pas avoir de problème après cela.

0

Essayez d’utiliser r.hasNext () au lieu de r.hasNextLine () :

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