Es scheint, dass es verschiedene Möglichkeiten gibt, Daten von Dateien in Java zu lesen und zu schreiben.
Ich möchte ASCII-Daten aus einer Datei lesen. Was sind die möglichen Wege und ihre Unterschiede?
Meine Lieblingsmethode zum Lesen einer kleinen Datei ist die Verwendung eines BufferedReader und eines StringBuilders. Es ist sehr einfach und auf den Punkt gebracht (wenn auch nicht besonders effektiv, aber gut genug für die meisten Fälle):
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Einige haben darauf hingewiesen, dass man nach Java 7 try-with-resources verwenden sollte (d.h. Auto-Close) Funktionen nutzen sollte:
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
Wenn ich Strings wie diesen lese, möchte ich in der Regel ohnehin eine String-Verarbeitung pro Zeile durchführen, also entscheide ich mich für diese Implementierung.
Wenn ich allerdings nur eine Datei in einen String einlesen möchte, verwende ich immer Apache Commons IO mit der Methode IOUtils.toString(). Sie können sich den Quelltext hier ansehen:
http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html
FileInputStream inputStream = new FileInputStream("foo.txt");
try {
String everything = IOUtils.toString(inputStream);
} finally {
inputStream.close();
}
Und mit Java 7 ist es noch einfacher:
try(FileInputStream inputStream = new FileInputStream("foo.txt")) {
String everything = IOUtils.toString(inputStream);
// do something with everything string
}
ASCII ist eine TEXT-Datei, also würden Sie Readers
zum Lesen verwenden. Java unterstützt auch das Lesen aus einer Binärdatei mit InputStreams
. Wenn die zu lesenden Dateien sehr groß sind, sollten Sie einen BufferedReader
zusätzlich zu einem FileReader
verwenden, um die Leseleistung zu verbessern.
Lesen Sie diesen Artikel, wie man einen Reader
verwendet.
Ich empfehle Ihnen auch, dieses wunderbare (und kostenlose) Buch namens Thinking In Java herunterzuladen und zu lesen.
In Java 7:
new String(Files.readAllBytes(...))
(docs) oder
Files.readAllLines(...)
In Java 8:
Files.lines(..).forEach(...)
Am einfachsten ist es, die Klasse Scanner
in Java und das FileReader-Objekt zu verwenden. Einfaches Beispiel:
Scanner in = new Scanner(new FileReader("filename.txt"));
Scanner
hat mehrere Methoden zum Einlesen von Zeichenketten, Zahlen usw... Weitere Informationen dazu finden Sie auf der Java-Dokumentationsseite.
Zum Beispiel das Lesen des gesamten Inhalts in einen String
:
StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
sb.append(in.next());
}
in.close();
outString = sb.toString();
Auch wenn Sie eine bestimmte Kodierung benötigen, können Sie dies anstelle von FileReader
verwenden:
new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)