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