Ich muss wiederholt Text an eine vorhandene Datei in Java anhängen. Wie mache ich das?
quelle
Ich muss wiederholt Text an eine vorhandene Datei in Java anhängen. Wie mache ich das?
Tun Sie dies zu Protokollierungszwecken? Wenn ja, gibt es dafür mehrere Bibliotheken . Zwei der beliebtesten sind Log4j und Logback .
Wenn Sie dies nur einmal tun müssen, macht die Files-Klasse dies einfach:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Vorsicht : Der obige Ansatz NoSuchFileException
löst a aus, wenn die Datei noch nicht vorhanden ist. Außerdem wird eine neue Zeile nicht automatisch angehängt (was häufig beim Anhängen an eine Textdatei gewünscht wird). Steve Chambers 'Antwort beschreibt, wie man das mit dem Files
Unterricht machen kann.
Wenn Sie jedoch mehrmals in dieselbe Datei schreiben, muss die oben genannte Datei auf der Festplatte mehrmals geöffnet und geschlossen werden. Dies ist ein langsamer Vorgang. In diesem Fall ist ein gepufferter Writer besser:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Anmerkungen:
FileWriter
Konstruktors weist ihn an, an die Datei anzuhängen, anstatt eine neue Datei zu schreiben. (Wenn die Datei nicht vorhanden ist, wird sie erstellt.)BufferedWriter
wird für einen teuren Schriftsteller (z. B. FileWriter
) empfohlen .PrintWriter
Sie Zugriff auf die println
Syntax, an die Sie wahrscheinlich gewöhnt sind System.out
.BufferedWriter
und PrintWriter
Wrapper sind nicht unbedingt notwendig.try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Wenn Sie eine robuste Ausnahmebehandlung für älteres Java benötigen, wird es sehr ausführlich:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
new BufferedWriter(...)
löst eine Ausnahme aus. Wird dasFileWriter
geschlossen sein? Ich denke, dass es nicht geschlossen wird, weil dieclose()
Methode (unter normalen Bedingungen) für dasout
Objekt aufgerufen wird, was in diesem Fall nicht initialisiert wird - also wird dieclose()
Methode tatsächlich nicht aufgerufen -> die Datei wird geöffnet, aber wird nicht geschlossen. Also IMHO sollte dietry
Aussage so aussehentry(FileWriter fw = new FileWriter("myFile.txt")){ Print writer = new ....//code goes here }
Und er sollteflush()
der Autor, bevor er dentry
Block verlässt !!!StandardOpenOption.APPEND
wird sie nicht erstellt - wie ein stiller Fehler, da sie auch keine Ausnahme auslöst. (2) Verwenden.getBytes()
bedeutet, dass vor oder nach dem angehängten Text kein Rückgabezeichen steht. Habe eine alternative Antwort hinzugefügt , um diese zu beheben.Sie können
fileWriter
mit einem Flagtrue
zum Anhängen verwenden.quelle
close
solltefinally
wie in der Antwort von @ etech gezeigt in einen Block eingefügt werden, falls zwischen der Erstellung von FileWriter und dem Aufrufen von close eine Ausnahme ausgelöst wird.try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Sollten nicht alle Antworten hier mit Try / Catch-Blöcken die .close () - Teile enthalten, die in einem finally-Block enthalten sind?
Beispiel für eine markierte Antwort:
Ab Java 7 können Sie auch eine Try-with-Resources-Anweisung verwenden . Zum Schließen der deklarierten Ressource (n) ist kein endgültiger Block erforderlich, da dieser automatisch behandelt wird und auch weniger ausführlich ist:
quelle
out
der Gültigkeitsbereich verlassen wird, wird es automatisch geschlossen, wenn Müll gesammelt wird, oder? In Ihrem Beispiel mit demfinally
Block denke ich, dass Sie tatsächlich einen weiteren verschachtelten Versuch / Fang benötigen,out.close()
wenn ich mich richtig erinnere. Die Java 7-Lösung ist ziemlich schick! (Ich habe seit Java 6 keinen Java-Entwickler mehr gemacht, daher war ich mit dieser Änderung nicht vertraut.)flush
Methode?Bearbeiten - Ab Apache Commons 2.1 ist der richtige Weg, dies zu tun:
Ich habe die Lösung von @ Kip so angepasst, dass die Datei endgültig geschlossen wird:quelle
Um die Antwort von Kip etwas zu erweitern , finden Sie hier eine einfache Java 7+ -Methode, mit der Sie eine neue Zeile an eine Datei anhängen und diese erstellen können, falls sie noch nicht vorhanden ist :
Hinweis: Die oben genannten Verwendungen der
Files.write
Überlastung , die schreibt Zeilen von Text in eine Datei (dh ähnlich wie einprintln
Befehl). Um nur Text bis zum Ende zu schreiben (dh ähnlich einemprint
Befehl), kann eine alternativeFiles.write
Überladung verwendet werden, die ein Byte-Array (z"mytext".getBytes(StandardCharsets.UTF_8)
. B. ) übergibt .quelle
.CREATE
macht den Job für dich.Stellen Sie sicher, dass der Stream in allen Szenarien ordnungsgemäß geschlossen wird.
Es ist etwas alarmierend, wie viele dieser Antworten das Dateihandle im Fehlerfall offen lassen. Die Antwort https://stackoverflow.com/a/15053443/2498188 ist auf dem Geld, aber nur, weil
BufferedWriter()
nicht werfen kann. Wenn dies möglich wäre, würde eine Ausnahme dasFileWriter
Objekt offen lassen.Eine allgemeinere Methode, die sich nicht darum kümmert, ob
BufferedWriter()
sie werfen kann:Bearbeiten:
Ab Java 7 wird empfohlen, "mit Ressourcen versuchen" zu verwenden und die JVM damit umgehen zu lassen:
quelle
PrintWriter.close()
ist nicht wiethrows IOException
in den Dokumenten deklariert . Wenn man sich die Quelleclose()
ansieht, kann die Methode tatsächlich nicht werfenIOException
, da sie sie vom zugrunde liegenden Stream abfängt und ein Flag setzt. Wenn Sie also am Code für das nächste Space Shuttle oder ein Röntgendosis-Messsystem arbeiten, sollten Sie ihnPrintWriter.checkError()
nach dem Versuch verwendenout.close()
. Dies sollte wirklich dokumentiert worden sein.XX.close()
seinen eigenen Versuch / Fang haben, oder? Zum Beispielout.close()
könnte eine Ausnahme ausgelöst werden, in welchem Fallbw.close()
undfw.close()
würde nie aufgerufen werden, undfw
ist diejenige, die am kritischsten zu schließen ist.In Java-7 kann dies auch folgendermaßen geschehen:
// ---------------------
quelle
Java 7+
Meiner bescheidenen Meinung nach würde ich, da ich ein Fan von einfachem Java bin, etwas vorschlagen, das eine Kombination der oben genannten Antworten ist. Vielleicht komme ich zu spät zur Party. Hier ist der Code:
Wenn die Datei nicht vorhanden ist, wird sie erstellt und wenn sie bereits vorhanden ist, wird der sampleText an die vorhandene Datei angehängt . Auf diese Weise können Sie Ihrem Klassenpfad keine unnötigen Bibliotheken hinzufügen.
quelle
Dies kann in einer Codezeile erfolgen. Hoffe das hilft :)
quelle
Verwenden von java.nio. Dateien zusammen mit java.nio.file. StandardOpenOption
Dadurch wird eine
BufferedWriter
Verwendung von Dateien erstellt, dieStandardOpenOption
Parameter akzeptiert , und eine automatische SpülungPrintWriter
aus dem ErgebnisBufferedWriter
.PrintWriter
Dieprintln()
Methode kann dann aufgerufen werden, um in die Datei zu schreiben.Die
StandardOpenOption
in diesem Code verwendeten Parameter: Öffnet die Datei zum Schreiben, hängt sie nur an die Datei an und erstellt die Datei, wenn sie nicht vorhanden ist.Paths.get("path here")
kann durch ersetzt werdennew File("path here").toPath()
. UndCharset.forName("charset name")
kann modifiziert werden, um das gewünschte aufzunehmenCharset
.quelle
Ich füge nur kleine Details hinzu:
2.nd Parameter (true) ist eine Funktion (oder Schnittstelle), die als anhängbar bezeichnet wird ( http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html ). Es ist dafür verantwortlich, dass am Ende einer bestimmten Datei / eines bestimmten Streams Inhalte hinzugefügt werden können. Diese Schnittstelle ist seit Java 1.5 implementiert. Jedes Objekt (dh BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer ) mit dieser Schnittstelle kann zum Hinzufügen von Inhalten verwendet werden
Mit anderen Worten, Sie können Ihrer komprimierten Datei Inhalte oder einen http-Prozess hinzufügen
quelle
Beispiel mit Guave:
quelle
Versuchen Sie es mit bufferFileWriter.append, es funktioniert bei mir.
quelle
Dies wird tun, was Sie beabsichtigen ..
quelle
Besser, Try-with-Resources zu verwenden, als all das Geschäft vor Java 7
quelle
Wenn wir Java 7 und höher verwenden und auch den Inhalt kennen, der der Datei hinzugefügt (angehängt) werden soll, können wir die newBufferedWriter- Methode im NIO-Paket verwenden.
Es gibt einige Punkte zu beachten:
StandardCharsets
.try-with-resource
Anweisung, in der Ressourcen nach dem Versuch automatisch geschlossen werden.OP hat zwar nicht gefragt, aber nur für den Fall, dass wir nach Zeilen mit einem bestimmten Schlüsselwort suchen möchten, z. B. können
confidential
wir Stream-APIs in Java verwenden:quelle
write(String string)
eine neue Zeile nach jeder geschriebenen Zeichenfolge erwarten,newLine()
sollte dies aufgerufen werdenMit true können die Daten in der vorhandenen Datei angehängt werden. Wenn wir schreiben werden
Die vorhandene Datei wird überschrieben. Gehen Sie also zum ersten Ansatz.
quelle
quelle
Dann fangen Sie eine IOException irgendwo stromaufwärts ab.
quelle
Erstellen Sie eine Funktion an einer beliebigen Stelle in Ihrem Projekt und rufen Sie diese Funktion einfach dort auf, wo Sie sie benötigen.
Leute, ihr müsst euch daran erinnern, dass ihr aktive Threads aufruft, die ihr nicht asynchron aufruft, und da es wahrscheinlich gute 5 bis 10 Seiten wären, um es richtig zu machen. Warum verbringen Sie nicht mehr Zeit mit Ihrem Projekt und vergessen, alles zu schreiben, was bereits geschrieben wurde? Richtig
Drei Zeilen Code zwei wirklich, da die dritte tatsächlich Text anfügt. : P.
quelle
quelle
Sie können dies auch versuchen:
quelle
Ich könnte das Apache Commons-Projekt vorschlagen . Dieses Projekt bietet bereits einen Rahmen, um das zu tun, was Sie benötigen (dh eine flexible Filterung von Sammlungen).
quelle
Mit der folgenden Methode können Sie Text an eine Datei anhängen:
Alternativ mit
FileUtils
:Es ist nicht effizient, funktioniert aber gut. Zeilenumbrüche werden korrekt behandelt und eine neue Datei wird erstellt, falls noch keine vorhanden ist.
quelle
Dieser Code erfüllt Ihre Anforderungen:
quelle
Im Fall , dass Sie einen Text in bestimmten Zeilen ADD Sie zunächst die gesamte Datei lesen können, fügen Sie den Text , wo immer Sie wollen , und dann überschreibt alles wie in dem folgenden Code:
quelle
Meine Antwort:
quelle
quelle
Sie können den folgenden Code verwenden, um den Inhalt der Datei anzuhängen:
quelle
1.7 Ansatz:
quelle