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