Lesen Sie den gesamten Text aus einer Datei
Java 11 hat die Methode readString () hinzugefügt , um kleine Dateien als Zeilenabschlusszeichen zu lesen String
:
String content = Files.readString(path, StandardCharsets.US_ASCII);
Für Versionen zwischen Java 7 und 11 ist hier eine kompakte, robuste Sprache, die in einer Dienstprogrammmethode zusammengefasst ist:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
Lesen Sie Textzeilen aus einer Datei
Java 7 hat eine bequeme Methode zum Lesen einer Datei als Textzeilen hinzugefügt , die als dargestellt wird List<String>
. Dieser Ansatz ist "verlustbehaftet", da die Zeilentrennzeichen vom Ende jeder Zeile entfernt werden.
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Java 8 fügte die Files.lines()
Methode hinzu , um a zu erzeugen Stream<String>
. Auch diese Methode ist verlustbehaftet, da Zeilentrennzeichen entfernt werden. Wenn IOException
beim Lesen der Datei ein auftritt , wird es in ein eingeschlossen UncheckedIOException
, da Stream
keine Lambdas akzeptiert werden, die geprüfte Ausnahmen auslösen.
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
Dies Stream
erfordert einen close()
Anruf; Dies ist in der API schlecht dokumentiert, und ich vermute, dass viele Leute nicht einmal bemerken, dass Stream
es eine gibtclose()
Methode gibt. Stellen Sie sicher, dass Sie wie gezeigt einen ARM-Block verwenden.
Wenn Sie mit einer anderen Quelle als einer Datei arbeiten, können Sie die lines()
Methode in verwendenBufferedReader
stattdessen verwenden.
Speicherauslastung
Die erste Methode, bei der Zeilenumbrüche beibehalten werden, kann vorübergehend Speicherplatz benötigen, der um ein Vielfaches größer ist als die Datei, da für kurze Zeit der Inhalt der Rohdatei (ein Byte-Array) und die decodierten Zeichen (von denen jedes 16 Bit beträgt, selbst wenn es codiert ist) als 8 Bits in der Datei) befinden sich gleichzeitig im Speicher. Es ist am sichersten, auf Dateien anzuwenden, von denen Sie wissen, dass sie im Verhältnis zum verfügbaren Speicher klein sind.
Die zweite Methode, das Lesen von Zeilen, ist normalerweise speichereffizienter, da der Eingabebytepuffer zum Decodieren nicht die gesamte Datei enthalten muss. Es ist jedoch immer noch nicht für Dateien geeignet, die im Verhältnis zum verfügbaren Speicher sehr groß sind.
Zum Lesen großer Dateien benötigen Sie ein anderes Design für Ihr Programm, das einen Textblock aus einem Stream liest, verarbeitet und dann zum nächsten übergeht, wobei derselbe Speicherblock mit fester Größe wiederverwendet wird. Hier hängt "groß" von den Computerspezifikationen ab. Heutzutage kann dieser Schwellenwert viele Gigabyte RAM betragen. Die dritte Methode, a zu verwenden, Stream<String>
ist eine Möglichkeit, dies zu tun, wenn Ihre eingegebenen "Datensätze" zufällig einzelne Zeilen sind. (Mit der readLine()
Methode vonBufferedReader
ist das prozedurale Äquivalent zu diesem Ansatz.)
Zeichenkodierung
Eine Sache, die im Beispiel im ursprünglichen Beitrag fehlt, ist die Zeichenkodierung. Es gibt einige Sonderfälle, in denen die Plattform standardmäßig Ihren Wünschen entspricht, diese sind jedoch selten und Sie sollten in der Lage sein, Ihre Wahl zu rechtfertigen.
Die StandardCharsets
Klasse definiert einige Konstanten für die Codierungen, die für alle Java-Laufzeiten erforderlich sind:
String content = readFile("test.txt", StandardCharsets.UTF_8);
Die Plattformvorgabe ist in der Charset
Klasse selbst verfügbar :
String content = readFile("test.txt", Charset.defaultCharset());
Hinweis: Diese Antwort ersetzt weitgehend meine Java 6-Version. Das Dienstprogramm von Java 7 vereinfacht den Code sicher, und die alte Antwort, die einen zugeordneten Bytepuffer verwendete, verhinderte, dass die gelesene Datei gelöscht wurde, bis der zugeordnete Puffer mit Müll gesammelt wurde. Sie können die alte Version über den Link "Bearbeitet" zu dieser Antwort anzeigen.