it-swarm.com.de

Was ist der einfachste Weg, eine Datei in String einzulesen?

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

Nachdem ich das in der Vergangenheit schon hunderte Male gemacht hatte, fragte ich mich nur, wie ich das mit minimalen Codezeilen machen kann. Gibt es in Java nicht etwas wie String fileContents = XXX.readFile(myFile/*File*/) .. eher etwas, das so einfach aussieht?

Ich weiß, dass es Bibliotheken wie Apache Commons IO gibt, die solche Vereinfachungen bieten, oder ich kann sogar eine einfache Util-Klasse schreiben, um dies zu tun. Aber alles, was ich mich wundere, ist, dass dies eine so häufige Operation ist, die jeder braucht. Warum bietet Java dann nicht so einfache Funktionen? Gibt es nicht wirklich irgendwo eine einzige Methode, um eine Datei mit einer vorgegebenen oder festgelegten Codierung in einen String zu lesen?

252
Gopi

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

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

Dabei wird ein Java.util.Scanner verwendet, um die Eingabe mit _\Z_ abzugrenzen. Dies ist das Ende des Zeichenfolgenankers. Dies führt letztendlich dazu, dass die Eingabe ein tatsächliches Token enthält, das die gesamte Datei ist, sodass sie mit einem Aufruf von next() gelesen werden kann.

Es gibt einen Konstruktor , der ein File und ein _String charSetName_ (neben vielen anderen Überladungen) akzeptiert. Diese beiden Konstruktoren können FileNotFoundException auslösen, aber wie alle Scanner Methoden kann kein IOException über diese Konstruktoren hinaus ausgelöst werden.

Sie können Scanner selbst mit der Methode ioException() abfragen, ob ein IOException aufgetreten ist oder nicht. Möglicherweise möchten Sie auch explizit close() das Scanner, nachdem Sie den Inhalt gelesen haben. Daher ist es am besten, die Scanner -Referenz in einer lokalen Variablen zu speichern.

Siehe auch

Verwandte Fragen


Bibliotheksoptionen von Drittanbietern

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

Guave

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

Apache Commons/IO

org.Apache.commons.io.IOUtils bieten auch ähnliche Funktionen:

  • String toString(InputStream, String encoding)
    • Ruft mit der angegebenen Zeichenkodierung den Inhalt eines InputStream als String ab.
  • List readLines(InputStream, String encoding)
    • ... als (unverarbeiteter) List von String, ein Eintrag pro Zeile

Verwandte Fragen

344

Ab Java 7 (API Description) haben Sie folgende Möglichkeiten:

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

Wobei filePath eine Zeichenfolge ist, die die zu ladende Datei darstellt.

187
Jim

Sie können Apache Commons IO verwenden.

FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));

String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");
42
Rakesh Goyal

Das 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")));
}
31
DDas

Verwenden Sie 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.

22
cjungel

Schreiben Sie nicht Ihre eigene Util-Klasse, um dies zu tun - ich würde empfehlen, Guava zu verwenden, das voller Güte ist. In diesem Fall möchten Sie entweder die Klasse Files (wenn Sie wirklich nur eine Datei lesen) oder CharStreams für allgemeinere Lesezwecke. Es gibt Methoden, um die Daten in eine Liste von Strings (readLines) oder total (toString) einzulesen.

Ähnlich nützliche Methoden gibt es auch für Binärdaten. Und dann ist da noch der Rest der Bibliothek ...

Ich stimme zu, es ist ärgerlich, dass es in den Standardbibliotheken nichts Vergleichbares gibt. Verdammt, nur in der Lage zu sein, einen CharSet an einen FileReader zu liefern, würde das Leben ein wenig einfacher machen ...

10
Jon Skeet

Ein anderer alternativer Ansatz ist:

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

Eine andere Möglichkeit ist die Verwendung von Dienstprogrammen, die als Open Source-Bibliotheken bereitgestellt werden
http://commons.Apache.org/io/api-1.4/index.html?org/Apache/commons/io/IOUtils.html

Warum bietet Java keine so gebräuchliche util-API?
a) , um die APIs generisch zu halten, so dass das Codieren, Puffern usw. vom Programmierer übernommen wird.
b) veranlassen, dass Programmierer etwas arbeiten und OpenSource mit Bibliotheken schreiben/teilen: D ;-)

7
Bhuvan Gupta

Traurigerweise Nein.

Ich bin damit einverstanden, dass solch eine häufige Operation eine einfachere Implementierung haben sollte als das zeilenweise Kopieren der Eingabe in einer Schleife, aber Sie müssen entweder eine Hilfsmethode schreiben oder eine externe Bibliothek verwenden.

6
Nikita Rybak

Ich habe festgestellt, dass die akzeptierte Antwort nicht immer funktioniert, da \\Z in der Datei vorkommen kann. Ein weiteres Problem ist, dass, wenn Sie nicht den richtigen Zeichensatz haben, eine ganze Reihe unerwarteter Dinge passieren können, 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 niemals in der Datei vorkommt. Dies ist jedoch theoretisch unmöglich. Was wir tun KÖNNEN, ist die Verwendung eines Begrenzers, der in der Datei mit einer so geringen Wahrscheinlichkeit vorkommt, dass er vernachlässigbar ist: Ein solcher Begrenzer ist ein UUID , das in Java nativ unterstützt wird.

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