lire le fichier complet sans utiliser la boucle en java


103

Duplication possible:
Comment créer une chaîne Java à partir du contenu d'un fichier Fichier
texte entier vers une chaîne en Java

J'essaie de lire le contenu d'un fichier en utilisant FileReader. Mais je veux lire le fichier sans lire une ligne par ligne. Est-il possible de lire le fichier entier sans boucle. J'utilise le code suivant

 try
 {
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     {
          s=br.readLine();
     }
 }

 catch(Exception ex)
 {
     ex.printStackTrace();
 }

Ce code ne se compilera pas pour commencer.
Arya Pourtabatabaie

Il existe une solution Java 11 en une ligne à cela: stackoverflow.com/a/52301018/942774
Hendrik

Réponses:


129

Si le fichier est petit , vous pouvez lire toutes les données une fois:

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

4
Ne fonctionne pas pour les ressources SA Android d'InputStream (aucune longueur)
akauppi

10
Quelle est la taille «petite»?
argent

8
@silver Tout le contenu du fichier sera stocké en mémoire. Alors, évitez de lire des fichiers de 5 Go comme celui-ci :-)
Thibaut D.

2
Remarque: file.length()peut renvoyer 0 pour les fichiers sous /proc. Et dans ces cas, cet extrait renverra une chaîne vide.
Mygod

1
Peut également readne pas remplir tout le tampon. Cela peut fonctionner dans la pratique avec la plupart des JRE, mais il n'y a aucune garantie dans l'API.
Daniel Lubarov

179

Solution Java 7 en une ligne

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

ou

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

1
Impossible de trouver ces fichiers dans Android.
akauppi

23
Toutes les réponses Java ne doivent pas nécessairement être adaptées à Android, @akauppi! Recherchez simplement une solution prise en charge par Android à partir d'une autre réponse!
Isaac Woods

String text = Files.readString(Paths.get("file"));est encore plus court, en supposant que vous souhaitiez une sortie de chaîne UTF-8.
Eagterrian Knight

Et si vous avez déjà l'objet File, vous pouvez le faire à l' file.toPath()intérieurreadAllBytes
Kartik Chugh

Important pour Android: Call requires API level 26: java.nio.file.Files#readAllBytes- même chose pour readString.
Néph

33

Vous pouvez essayer d'utiliser Scanner si vous utilisez JDK5 ou supérieur.

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

Ou vous pouvez également utiliser Guava

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

4
Notez que le scanner doit être fermé après utilisation.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Juste une petite faute de frappe. :-)
pisaruk

1
Ce code Scannerne lit que les 1024 premiers octets du fichier. Regardez le code source. Il lit le tampon et le vérifie avec cette expression rationnelle. Ceci est toujours valide - alors il renvoie tout le contenu de la mémoire tampon. Par défaut, le tampon a une taille de 1024 octets.
Enyby

2
C'est une mauvaise approche. La bonne solution (pour Java 1.7 et supérieur) est Files.readAllLines(). Pour les JRE hérités, FileInputStream.read()c'est probablement le meilleur. Je ne sais pas si c'est portable sur toutes les plates-formes (c.-à-d. Que Ctl-Z est reconnu partout), et il est facile de manquer de faire un Scanner.close().
paulsm4

33

Si vous utilisez Java 5/6, vous pouvez utiliser Apache Commons IO pour lire un fichier en chaîne. La classe org.apache.commons.io.FileUtilscontient plusieurs méthodes de lecture de fichiers.

par exemple en utilisant la méthode FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

1
C'est probablement la solution la plus simple en utilisant une bibliothèque tierce.
argent

3
Code minimal à écrire; Beaucoup plus de bibliothèques à ajouter au projet.
Please_Dont_Bully_Me_SO_Lords

2
La méthode readFileToString (File) du type FileUtils est obsolète
JavaSheriff

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.