Ich verwende das untenstehende Idiom schon seit einiger Zeit. Und es scheint das weit verbreitetste zu sein, zumindest auf den Seiten, die ich besucht habe.
Gibt es einen besseren/anderen Weg, um eine Datei in einen String in Java zu lesen?
private String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader (file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
try {
while((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
return stringBuilder.toString();
} finally {
reader.close();
}
}
8 Stimmen
Kann mir jemand auf eine sehr einfache Weise erklären, was es mit dem NIO auf sich hat? Jedes Mal, wenn ich darüber lese, verliere ich mich in der x-ten Erwähnung eines Kanals :(
8 Stimmen
Bitte beachten Sie, dass nicht garantiert ist, dass der Zeilentrenner in der Datei derselbe ist wie der Zeilentrenner des Systems.
7 Stimmen
Der obige Code hat einen Fehler, bei dem ein zusätzliches Zeilenumbruchzeichen in der letzten Zeile hinzugefügt wird. Es sollte etwas Ähnliches wie folgt sein: if ( (line = reader.readLine()) != null) { stringBuilder.append( line ); } while ( (line = reader.readLine()) != null) { stringBuilder.append( ls ); stringBuilder.append( line ); }
32 Stimmen
Java 7 führt
byte[] Files.readAllBytes(file);
ein. An diejenigen, die die 'einzeilige' Scanner-Lösung vorschlagen: Muss man es nicht schließen?0 Stimmen
@OscarRyz Der größte Unterschied für mich ist, dass NIO es ermöglicht, auf viele Ports zu hören, ohne einen Thread für jeden zuzuweisen. Kein Problem, es sei denn, Sie möchten ein Paket an jede Maschine im Adressraum eines Klasse-B-Netzwerks senden (65.000 Adressen), um zu sehen, was existiert. Windows läuft bei ungefähr 20.000 Threads aus (Habe dies herausgefunden, als ich genau dieses Problem gelöst habe - Entdeckung eines Klasse-A/B-Netzwerks, bevor es NIO gab, war es schwierig).
0 Stimmen
Wenn Sie die Files.readAllBytes() Implementierung sehen, werden Sie feststellen, dass sie einen kanal verwendet, der schließbar ist. Es ist also nicht erforderlich, ihn explizit zu schließen.
0 Stimmen
Mit der Einführung von Groovy können Sie die Datei so lesen: return new File( file).text()
0 Stimmen
Verknüpfen Sie einen anderen StackOverflow-Link, der gut erklärt ist: stackoverflow.com/questions/14169661/…
0 Stimmen
@Deep Die letzte Zeile in einer Textdatei ist normalerweise zeilenbeendet, daher ist das, was Sie als Fehler beschreiben, keiner, und Ihr Code hat den Fehler, alle Zeilentrennzeichen zu entfernen.
0 Stimmen
Bitte akzeptiere eine Antwort auf deine Frage und hilf dabei, dies zu klären.
0 Stimmen
An all jene armen Seelen, die Byte-basierte Methoden empfehlen, wenn offensichtlich Text behandelt werden sollte: Unsere Welt wird die Hölle sein, solange du in deiner Unwissenheit beharrst. (Ich meine, ich bin nachsichtig mit Code aus den 90ern in dieser Hinsicht, aber verdamm nochmal, wir sind im Jahr 2021, und Globalisierung und Nicht-ASCII-Zeichen sind etwas.)
0 Stimmen
@FranzD. Was denken Sie, wird verwendet, um diesen Text in einer Datei zu speichern?
0 Stimmen
@OscarRyz: Nun, Bytes, mein lieber Oscar. Aber byte-basierte Methoden neigen dazu, die Feinheiten der Byte <-> Zeichenkonvertierungen nicht angemessen zu behandeln. Und obwohl das funktionieren könnte, wenn du deinen Code mit ASCII oder vielleicht sogar Latin-1 testest, wird es furchtbar scheitern und Stunden an Arbeit und Frustration verursachen, sobald jemand versucht, Chinesisch oder eine andere "kleine" (in IHRER Welt) Sprache zu lesen/schreiben. Die meisten meiner ehemaligen Kollegen, die stolz sich "Software-Ingenieure" nannten, kannten weder noch interessierten sie sich für UTF-16-Ersatzzeichen, und ja, ich nenne das ignorant, weil das ist es.
0 Stimmen
@Franz D. Gut, dann lesen Sie Bytes und entschlüsseln sie unter Verwendung der geeigneten Zeichenkodierung. Sie nehmen fälschlicherweise an, dass die Datei in UTF-16 codiert wäre, aber sie könnte buchstäblich alles andere sein. Es wird dringend empfohlen, heute alles in UTF-8 zu verwenden. Lesen Sie die akzeptierte Antwort, sie enthält sehr nützliche Informationen.