Was ist der einfachste Weg, um eine Datei in String zu lesen?

Ich versuche, eine einfache Textdatei in einen String zu lesen. Natürlich gibt es die übliche Art, den Eingabestream zu erhalten und mit readLine () zu iterieren und Inhalte in String zu lesen.

Nachdem ich das hunderte Male in der Vergangenheit gemacht habe, habe ich mich gefragt, wie ich das in minimalen Zeilen Code machen kann? Gibt es nicht etwas in Java wie String fileContents = XXX.readFile(myFile/*File*/) .. eher alles, was so einfach aussieht?

Ich weiß, dass es Bibliotheken wie Apache Commons IO gibt, die solche Vereinfachungen bieten, oder sogar ich kann eine einfache Util-class schreiben, um dies zu tun. Aber alles, woran ich mich frage, ist – das ist eine so häufige Operation, die jeder braucht, warum bietet Java dann keine so einfache function? Gibt es nicht wirklich eine einzige Methode, um eine Datei mit einer Standardcodierung oder einer bestimmten Codierung in eine Zeichenfolge zu schreiben?

Ja, Sie können dies in einer Zeile (obwohl für eine robuste IOException Behandlung Sie nicht möchten).

 String content = new Scanner(new File("filename")).useDelimiter("\\Z").next(); System.out.println(content); 

Dies verwendet einen java.util.Scanner , der die Eingabe mit \Z , dem Ende des String-Ankers, abgrenzt. Dies führt letztendlich dazu, dass die Eingabe ein tatsächliches Token aufweist, nämlich die gesamte Datei, so dass sie mit einem Aufruf von next() gelesen werden kann.

Es gibt einen Konstruktor , der eine File und einen String charSetName (neben vielen anderen Überladungen) übernimmt. Diese beiden Konstruktoren können FileNotFoundException , aber wie bei allen Scanner Methoden kann keine IOException über diese Konstruktoren hinaus geworfen werden.

Sie können den Scanner selbst über die ioException() -Methode IOException , wenn eine IOException aufgetreten ist oder nicht. Sie können den Scanner auch explizit close() nachdem Sie den Inhalt gelesen haben. Daher empfiehlt es sich, die Scanner Referenz in einer lokalen Variablen zu speichern.

Siehe auch

  • Java Tutorials – I / O Essentials – Scannen und Formatieren

Verwandte Fragen

  • validation der Eingabe mit java.util.Scanner – hat viele Beispiele für mehr typische Verwendung

Bibliotheksoptionen von Drittanbietern

Der Vollständigkeit halber sind dies einige wirklich gute Optionen, wenn Sie diese sehr seriösen und äußerst nützlichen Bibliotheken von Drittanbietern haben:

Guave

com.google.common.io.Files enthält viele nützliche Methoden. Die relevanten sind hier:

  • String toString(File, Charset)
    • Mit dem gegebenen Zeichensatz werden alle Zeichen aus einer Datei in einen String
  • List readLines(File, Charset)
    • … liest alle Zeilen einer Datei in eine List , einen Eintrag pro Zeile

Apache Commons / IO

org.apache.commons.io.IOUtils bietet auch ähnliche functionen:

  • String toString(InputStream, String encoding)
    • Verwendet die angegebene Zeichencodierung, um den Inhalt eines InputStream als String InputStream
  • List readLines(InputStream, String encoding)
    • … als (rohe) String List , ein Eintrag pro Zeile

Verwandte Fragen

  • Die meisten nützlichen kostenlosen Java-Bibliotheken von Drittanbietern (gelöscht)?

Ab Java 7 (API-Beschreibung) können Sie Folgendes tun:

new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);

Wobei filePath ein String ist, der die Datei darstellt, die Sie laden möchten.

Sie können Apache Commons IO verwenden ..

 FileInputStream fisTargetFile = new FileInputStream(new File("test.txt")); String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8"); 

Dies sollte für Sie funktionieren:

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public static void main(String[] args) throws IOException { String content = new String(Files.readAllBytes(Paths.get("abc.java"))); } 

Verwenden von Apache Commons IO .

 import org.apache.commons.io.FileUtils; //... String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8") 

Sie können de Javadoc für die Methode für Details sehen.

Schreiben Sie nicht Ihre eigene Util-class, um dies zu tun – ich würde empfehlen, Guava , die voll von allen Arten von Güte ist. In diesem Fall möchten Sie entweder die Files class (wenn Sie wirklich nur eine Datei lesen) oder CharStreams für allgemeinere Lesarten. Es hat Methoden, um die Daten in eine Liste von Strings ( readLines ) oder total ( toString ) zu lesen.

Es hat ähnliche nützliche Methoden für binäre Daten auch. Und dann ist da noch der Rest der Bibliothek …

Ich stimme zu, dass es ärgerlich ist, dass es in den Standardbibliotheken nichts Ähnliches gibt. CharSet , nur ein CharSet zu einem FileReader zu FileReader würde das Leben ein bisschen einfacher machen …

Ein anderer alternativer Ansatz ist:

Wie erstelle ich eine Java-Zeichenfolge aus dem Inhalt einer Datei?

Eine andere Option besteht darin, von den Dienstprogrammen bereitgestellte Open-Source-Bibliotheken zu verwenden
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

Warum bietet Java keine so allgemeine util API?
a) um die APIs generisch zu halten, so dass Codierung, Pufferung usw. vom Programmierer gehandhabt wird.
b) Machen Programmierer etwas Arbeit und schreiben / teilen opensource util Bibliotheken: D 😉

Traurigerweise Nein.

Ich stimme zu, dass eine solche häufige Operation eine einfachere Implementierung haben sollte als das Kopieren der Eingabe Zeile für Zeile in Schleife, aber Sie müssen entweder die Hilfsmethode schreiben oder eine externe Bibliothek verwenden.

Ich entdeckte, dass die angenommene Antwort nicht immer funktioniert, weil \\Z in der Datei auftreten kann. Ein weiteres Problem ist, dass, wenn Sie nicht den richtigen Zeichensatz haben, eine ganze Reihe von unerwarteten Dingen passieren kann, die dazu führen können, dass der Scanner nur einen Teil der Datei liest.

Die Lösung besteht darin, ein Trennzeichen zu verwenden, von dem Sie sicher sind, dass es in der Datei nie vorkommen wird. Dies ist jedoch theoretisch unmöglich. Was wir tun können, ist ein Begrenzer zu verwenden, der in der Datei eine so geringe Chance hat, dass er vernachlässigbar ist: Ein solches Trennzeichen ist eine UUID , die nativ in Java unterstützt wird.

 String content = new Scanner(file, "UTF-8") .useDelimiter(UUID.randomUUID().toString()).next(); 

Unten ist der einfache Code, um den Inhalt der Datei in eine Zeichenfolge zu lesen

  try { String line; File file = new File("C:/LEO/abc.txt"); FileReader fr = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fr); HashMap< String, Integer> objHashMap = new HashMap<>(); while((line = bufferedReader.readLine()) != null) { String lineWords[] = line.split(" "); for(String singleWord:lineWords) { System.out.println(singleWord); } } for(String keyObject:objHashMap.keySet()) { System.out.println(keyObject + ": " + objHashMap.get(keyObject)); } } catch(Exception exception) { System.out.println("IOException occured"); exception.printStackTrace(); }