web-dev-qa-db-fra.com

Comment lire un seul mot (ou une ligne) d'un fichier texte Java?

Comme le titre l'indique, j'essaie d'écrire un programme capable de lire des mots individuels à partir d'un fichier texte et de les stocker dans des variables String. Je sais comment utiliser une variable FileReader ou FileInputStream pour lire une seule variable char, mais ce que j'essaie de faire ne fonctionnera pas. Une fois les mots saisis, j'essaie de les comparer à d'autres variables String de mon programme en utilisant .equals. Il serait donc préférable de les importer en tant que chaînes. Je peux aussi entrer une ligne entière à partir d'un fichier texte en tant que chaîne, auquel cas il suffit d'insérer un mot sur chaque ligne de mon fichier. Comment saisir des mots dans un fichier texte et les stocker dans des variables String? 

EDIT: .__ Ok, ce type de doublon aide. Cela fonctionnera peut-être pour moi mais la raison pour laquelle ma question est un peu différente est que le duplicata indique uniquement comment lire une seule ligne. J'essaie de lire les mots individuels dans la ligne. Donc, fondamentalement, diviser la ligne String. 

4
Ashwin Gupta

Pour lire les lignes d'un fichier texte, vous pouvez utiliser ceci (utilise try-with-resources):

String line;

try (
    InputStream fis = new FileInputStream("the_file_name");
    InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
    BufferedReader br = new BufferedReader(isr);
) {
    while ((line = br.readLine()) != null) {
        // Do your thing with line
    }
}

Version plus compacte et moins lisible de la même chose:

String line;

try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("the_file_name"), Charset.forName("UTF-8")))) {
    while ((line = br.readLine()) != null) {
        // Do your thing with line
    }
}

Pour couper une ligne en mots individuels, vous pouvez utiliser String.split :

while ((line = br.readLine()) != null) {
    String[] words = line.split(" ");
    // Now you have a String array containing each Word in the current line
}
7
spork

Ce sont toutes des réponses très complexes. Et je suis sûr qu'ils sont tous utiles. Mais je préfère le élégamment simple Scanner:

public static void main(String[] args) throws Exception{
    Scanner sc = new Scanner(new File("fileName.txt"));
    while(sc.hasNext()){
        String s = sc.next();
        //.....
    }
}
7
Misha

En Java8, vous pouvez faire quelque chose comme ceci:

import Java.io.IOException;
import Java.nio.file.Files;
import Java.nio.file.Paths;
import Java.util.Arrays;
import Java.util.Collections;
import Java.util.List;
import Java.util.stream.Collectors;

public class Foo {
    public List<String> readFileIntoListOfWords() {
        try {
            return Files.readAllLines(Paths.get("somefile.txt"))
                .stream()
                .map(l -> l.split(" "))
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }
}

Bien que je soupçonne que l’argument de scission peut avoir besoin d’être modifié, par exemple pour réduire la ponctuation à la fin d’un mot

1
beresfordt

Vous devez utiliser StringTokenizer! voici un exemple et lisez ceci String Tokenizer

private BufferedReader innerReader; 
public void loadFile(Reader reader)
        throws IOException {
    if(reader == null)
    {
        throw new IllegalArgumentException("Reader not valid!");
    }
        this.innerReader = new BufferedReader(reader);
    String line;
    try
    {
    while((line = innerReader.readLine()) != null)
    {
        if (line == null || line.trim().isEmpty())
            throw new IllegalArgumentException(
                    "line empty");
        //StringTokenizer use delimiter for split string
        StringTokenizer tokenizer = new StringTokenizer(line, ","); //delimiter is ","
        if (tokenizer.countTokens() < 4)
            throw new IllegalArgumentException(
                    "Token number not valid (<= 4)");
        //You can change the delimiter if necessary, string example
        /*
        Hello / bye , hi
        */
        //reads up "/"
        String hello = tokenizer.nextToken("/").trim();
        //reads up ","
        String bye = tokenizer.nextToken(",").trim();
        //reads up to end of line
        String hi = tokenizer.nextToken("\n\r").trim();
        //if you have to read but do not know if there will be a next token do this
        while(tokenizer.hasMoreTokens())
        {
          String mayBe = tokenizer.nextToken(".");
        }
    }
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}
1
Michele Lacorte