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();
 }
Adesh Singh
la source
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");
imxylz
la source
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);
Evgeniy Dorofeev
la source
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);
Jayamohan
la source
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);
Paul Vargas
la source
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