Lire la ligne avec Scanner

EDIT pour d'autres lecteurs: 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);
        }
    }

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 while, car R. hasNextLine () renvoie toujours "false". Une idée sur ce que je fais mal ?

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

EDIT : je précise aussi que j'ai essayé avec un autre fichier et que j'ai obtenu le même résultat, ce qui signifie qu'il ne vient pas du fichier apparemment.

Le fichier ressemble à ceci :

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

Modifier 2: Le contenu du fichier semble être problématique car le problème persiste uniquement si je copie / colle le contenu de mon fichier à un autre. En clair, si j'écris ce contenu moi-même, cela fonctionne, si j'utilise une partie du contenu de mon dico.fichier txt, ça ne marche pas. Une explication ?

Modifier 3: Voici 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

23
demandé sur Sharcoux 2013-12-01 14:42:49

5 réponses

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 effectuer la même chose.

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

Vous devez vérifier s'il y a un jeton suivant disponible, puis lire le jeton suivant. Vous devrez également vérifier deux fois l'entrée donnée au Scanner. c'est à dire de la soad.txt. Par défaut, Scanner interrompt son entrée 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:

, j'ai juste essayé 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 ci-dessous code.it ça a bien marché.

 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

Donc, je suis sûr que cela devrait fonctionner. Puisque vous travaillez dans Windows ennvironment, la séquence de fin de ligne (EOL) (0x0D 0x0A, \r\n) est en fait deux caractères ASCII, une combinaison des caractères CR et LF. si vous définissez votre instance de Scanner pour utiliser delimiter comme suit, elle sélectionnera vers le haut probablement

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

Puis faites votre boucle pour lire les lignes. Espérons que cette aide!

16
répondu Keerthivasan 2013-12-01 17:58:45

Les méthodes

Next() et nextLine() sont associées à Scanner et sont utilisées pour obtenir des entrées de chaîne. 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 avoir lu l'entrée.

NextLine() lit l'entrée y compris l'espace entre les mots (c'est-à-dire qu'il lit jusqu'à la fin de la ligne \n). Une fois l'entrée lue, nextLine() positionne le curseur dans le suivant ligne.

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
répondu anon 2013-12-02 05:45:26
/*
 * 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
répondu Zuhair Sagga 2015-04-05 08:06:23

Essayez d'utiliser R. hasNext () au lieu de R. hasNextLine():

while(r.hasNext()) {
        scan = r.next();
0
répondu yuvalhuck 2013-12-01 10:59:48

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


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

La solution est: codeur votre .fichier txt en UTF-8.
Cela peut être fait assez simple en enregistrant l'ouverture du fichier à nouveau et en changeant le codage en UTF-8. (Sous Win7 près du coin inférieur droit)

Le Scanner ne devrait pas avoir un problème après cela.

0
répondu Squirrel in training 2016-01-07 12:13:30