Lesen Sie die vollständige Datei ohne Verwendung einer Schleife in Java


103

Mögliches Duplikat:
So erstellen Sie einen Java-String aus dem Inhalt einer Datei
Vollständige Textdatei in einen String in Java

Ich versuche, den Inhalt einer Datei mit FileReader zu lesen. Aber ich möchte die Datei lesen, ohne eine Zeile für Zeile zu lesen. Ist es möglich, die gesamte Datei ohne Schleife zu lesen? Ich verwende den folgenden Code

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

Dieser Code wird zunächst nicht kompiliert.
Arya Pourtabatabaie

Es gibt eine einzeilige Java 11-Lösung für dieses Problem
Hendrik

Antworten:


129

Wenn die Datei klein ist , können Sie die gesamten Daten einmal lesen:

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
Funktioniert nicht für InputStreams sa Android-Assets (keine Länge)
akauppi

10
Wie klein ist "klein"?
Silber

8
@silver Der gesamte Inhalt der Datei wird gespeichert. Vermeiden Sie es also, 5-GB-Dateien wie diese zu lesen :-)
Thibaut D.

2
Hinweis: Gibt file.length()möglicherweise 0 für Dateien unter zurück /proc. In diesen Fällen gibt dieses Snippet eine leere Zeichenfolge zurück.
Mygod

1
Auch unter readUmständen nicht den gesamten Puffer füllen. In der Praxis funktioniert dies möglicherweise mit den meisten JREs, es gibt jedoch keine Garantie für die API.
Daniel Lubarov

179

Java 7 einzeilige Lösung

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

oder

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

1
Kann diese Dateien in Android nicht finden.
Akauppi

23
Nicht alle Java-Antworten müssen für Android geeignet sein, @akauppi! Suchen Sie nach einer Lösung, die Android unterstützt, anhand einer anderen Antwort!
Isaac Woods

String text = Files.readString(Paths.get("file"));ist sogar noch kürzer, vorausgesetzt, Sie möchten eine UTF-8-String-Ausgabe.
Eagterrian Knight

Und wenn Sie bereits das File - Objekt haben, können Sie file.toPath()innenreadAllBytes
Kartik Chugh

Wichtig für Android: Call requires API level 26: java.nio.file.Files#readAllBytes- Gleiches für readString.
Neph

33

Sie können versuchen, Scanner zu verwenden, wenn Sie JDK5 oder höher verwenden.

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

Oder Sie können auch Guave verwenden

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

4
Beachten Sie, dass der Scanner nach Gebrauch geschlossen werden sollte.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Nur ein kleiner Tippfehler. :-)
Pisaruk

1
Dieser Code Scannerliest nur die ersten 1024 Bytes aus der Datei. Schauen Sie sich den Quellcode an. Es liest Puffer und überprüft ihn mit diesem regulären Ausdruck. Dies ist immer gültig - dann wird der gesamte Pufferinhalt zurückgegeben. Standardmäßig hat der Puffer eine Größe von 1024 Bytes.
Enyby

2
Dies ist ein schlechter Ansatz. Die richtige Lösung (für Java 1.7 und höher) ist Files.readAllLines(). Für ältere JREs FileInputStream.read()ist dies wahrscheinlich am besten. Ich bin mir nicht sicher, ob es auf alle Plattformen portierbar ist (dh Ctl-Z wird überall erkannt), und es ist leicht zu übersehen, dass a Scanner.close().
Pauls4

33

Wenn Sie Java 5/6 verwenden, können Sie Apache Commons IO verwenden, um Dateien in Zeichenfolgen zu lesen. Die Klasse org.apache.commons.io.FileUtilsenthält mehrere Methoden zum Lesen von Dateien.

zB mit der Methode FileUtils#readFileToString:

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

1
Dies ist wahrscheinlich die einfachste Lösung mit einer Drittanbieter-Bibliothek.
Silber

3
Minimaler Code zum Schreiben; Viele weitere Bibliotheken zum Projekt hinzufügen.
Please_Dont_Bully_Me_SO_Lords

2
Die Methode readFileToString (File) vom Typ FileUtils ist veraltet
JavaSheriff

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.