Was ist der einfachste Weg, um eine (Text-) Datei in Java zu erstellen und in diese zu schreiben?
1383
Beachten Sie, dass jedes der folgenden Codebeispiele möglicherweise ausgelöst wird IOException
. Try / catch / finally-Blöcke wurden der Kürze halber weggelassen. Informationen zur Ausnahmebehandlung finden Sie in diesem Lernprogramm .
Beachten Sie, dass jedes der folgenden Codebeispiele die Datei überschreibt, wenn sie bereits vorhanden ist
Erstellen einer Textdatei:
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();
Erstellen einer Binärdatei:
byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();
Benutzer von Java 7+ können die Files
Klasse zum Schreiben in Dateien verwenden:
Erstellen einer Textdatei:
List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Erstellen einer Binärdatei:
byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
"PrintWriter prints formatted representations of objects to a text-output stream. "
Bozhos Antwort ist korrekter, obwohl sie umständlich aussieht (Sie können sie jederzeit in eine Dienstprogrammmethode einschließen).writer.close()
sollte in einem endgültigen Block seinIn Java 7 und höher:
Dafür gibt es jedoch nützliche Dienstprogramme:
Beachten Sie, dass auch Sie können verwenden ein
FileWriter
, aber es nutzt die Standard - Kodierung, die oft eine schlechte Idee - es ist am besten , die Codierung explizit angeben.Unten finden Sie die ursprüngliche Antwort vor Java 7
Siehe auch: Lesen, Schreiben und Erstellen von Dateien (einschließlich NIO2).
quelle
close()
einen Stream aufrufen, der um einen anderen gewickelt ist, werden auch alle inneren Streams geschlossen.Wenn Sie bereits über den Inhalt verfügen, den Sie in die Datei schreiben möchten (und der nicht im laufenden Betrieb generiert wird), bietet das
java.nio.file.Files
Hinzufügen in Java 7 als Teil der nativen E / A die einfachste und effizienteste Möglichkeit, Ihre Ziele zu erreichen.Grundsätzlich ist das Erstellen und Schreiben in eine Datei nur eine Zeile, außerdem ein einfacher Methodenaufruf !
Im folgenden Beispiel werden 6 verschiedene Dateien erstellt und in diese geschrieben, um zu zeigen, wie sie verwendet werden können:
quelle
quelle
output.close()
wirft IOExceptionHier ist ein kleines Beispielprogramm zum Erstellen oder Überschreiben einer Datei. Es ist die lange Version, damit es leichter verstanden werden kann.
quelle
Eine sehr einfache Möglichkeit, eine Datei in Java zu erstellen und in diese zu schreiben:
quelle
File.exists()/createNewFile()
Code hier ist sowohl sinnlos als auch verschwenderisch. Das Betriebssystem muss bereits genau das Gleiche tun, wenn dasnew FileWriter()
erstellt wird. Sie zwingen alles zweimal.FileWriter
wie folgt instanziieren :new FileWriter(file.getAbsoluteFile(),true)
Verwenden:
Mit
try()
wird der Stream automatisch geschlossen. Diese Version ist kurz, schnell (gepuffert) und ermöglicht die Auswahl der Codierung.Diese Funktion wurde in Java 7 eingeführt.
quelle
StandardCharsets.UTF_8
anstelle der "utf-8" -String verwenden (dies verhindert Tippfehler)...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
-java.nio.charset.StandardCharsets
wird in Java 7 eingeführtHier geben wir eine Zeichenfolge in eine Textdatei ein:
Wir können einfach eine neue Datei erstellen und Inhalte hinzufügen.
quelle
Da der Autor nicht angegeben hat, ob eine Lösung für Java-Versionen erforderlich ist, die EoL-geprüft wurden (sowohl von Sun als auch von IBM, und dies sind technisch die am weitesten verbreiteten JVMs), und aufgrund der Tatsache, dass die meisten Leute die Frage beantwortet zu haben scheinen Frage des Autors, bevor angegeben wurde, dass es sich um eine Textdatei (nicht binär) handelt , habe ich beschlossen, meine Antwort zu geben.
Erstens hat Java 6 im Allgemeinen das Ende seiner Lebensdauer erreicht, und da der Autor nicht angegeben hat, dass er Legacy-Kompatibilität benötigt, bedeutet dies vermutlich automatisch Java 7 oder höher (Java 7 wird von IBM noch nicht EoL-geprüft). Wir können uns also das Datei-E / A-Tutorial ansehen: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html
Na ja, das schließt java.io.File aus. Wenn eine Datei nicht geschrieben / angehängt werden kann, können Sie möglicherweise nicht einmal wissen, warum.
Wir können uns das Tutorial weiter ansehen: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common
Wenn Sie alle Zeilen haben, die Sie im Voraus in die Textdatei schreiben (anhängen), lautet der empfohlene Ansatz https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-
Hier ist ein Beispiel (vereinfacht):
Ein weiteres Beispiel (anhängen):
Wenn Sie Dateiinhalte während des Schreibens schreiben möchten : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-
Vereinfachtes Beispiel (Java 8 oder höher):
Ein weiteres Beispiel (anhängen):
Diese Methoden erfordern nur minimalen Aufwand seitens des Autors und sollten allen anderen beim Schreiben in [Text] -Dateien vorgezogen werden.
quelle
FileNotFoundException
.Wenn Sie eine relativ schmerzfreie Erfahrung machen möchten, können Sie sich auch das Apache Commons IO-Paket ansehen , genauer gesagt die
FileUtils
Klasse .Vergessen Sie niemals, Bibliotheken von Drittanbietern zu überprüfen. Joda-Zeit für Datumsmanipulation, Apache Commons Lang
StringUtils
für allgemeine Zeichenfolgenoperationen und dergleichen können Ihren Code lesbarer machen.Java ist eine großartige Sprache, aber die Standardbibliothek ist manchmal etwas niedrig. Kraftvoll, aber dennoch niedrig.
quelle
FileUtils
iststatic void write(File file, CharSequence data)
. Anwendungsbeispiel :import org.apache.commons.io.FileUtils;
FileUtils.write(new File("example.txt"), "string with data");
.FileUtils
hat auchwriteLines
, was eineCollection
von Zeilen nimmt.Wenn Sie aus irgendeinem Grund den Vorgang des Erstellens und Schreibens trennen möchten,
touch
lautet das Java-Äquivalent voncreateNewFile()
führt eine Existenzprüfung und eine Datei atomar durch. Dies kann nützlich sein, wenn Sie beispielsweise vor dem Schreiben sicherstellen möchten, dass Sie der Ersteller der Datei sind.quelle
touch
im allgemeinen Sinne, sondern in seiner üblichen sekundären Verwendung, eine Datei zu erstellen, ohne Daten darauf zu schreiben. Der dokumentierte Zweck von touch besteht darin, den Zeitstempel in der Datei zu aktualisieren. Das Erstellen der Datei, wenn sie nicht vorhanden ist, ist der eigentliche Nebeneffekt und kann mit einem Schalter deaktiviert werden.exists()/createNewFile()
Sequenzen sind buchstäblich eine Verschwendung von Zeit und Raum.Hier sind einige der möglichen Möglichkeiten, eine Datei in Java zu erstellen und zu schreiben:
Verwenden von FileOutputStream
Verwenden von FileWriter
Verwenden von PrintWriter
Verwenden von OutputStreamWriter
Weitere Informationen zum Lesen und Schreiben von Dateien in Java finden Sie in diesem Tutorial .
quelle
FileWriter
oderOutputStreamWriter
in einem endgültigen Block geschlossen werden?Verwenden:
quelle
Am besten verwenden Sie Java7: Java 7 bietet eine neue Arbeitsweise mit dem Dateisystem sowie eine neue Dienstprogrammklasse - Dateien. Mit der Files-Klasse können wir auch Dateien und Verzeichnisse erstellen, verschieben, kopieren, löschen. Es kann auch zum Lesen und Schreiben in eine Datei verwendet werden.
Schreiben mit FileChannel Wenn Sie mit großen Dateien arbeiten, kann FileChannel schneller als Standard-E / A sein. Der folgende Code schreibt mit FileChannel einen String in eine Datei:
Schreiben Sie mit DataOutputStream
Schreiben Sie mit FileOutputStream
Lassen Sie uns nun sehen, wie wir FileOutputStream verwenden können, um Binärdaten in eine Datei zu schreiben. Der folgende Code konvertiert einen String in Bytes und schreibt die Bytes mit einem FileOutputStream in eine Datei:
Schreiben mit PrintWriter Wir können einen PrintWriter verwenden, um formatierten Text in eine Datei zu schreiben:
Schreiben mit BufferedWriter: Verwenden Sie BufferedWriter, um einen String in eine neue Datei zu schreiben:
Fügen Sie der vorhandenen Datei einen String hinzu:
quelle
Ich denke, das ist der kürzeste Weg:
quelle
So erstellen Sie eine Datei, ohne eine vorhandene Datei zu überschreiben:
quelle
quelle
exists()/createNewFile()
Sequenzen sind buchstäblich eine Verschwendung von Zeit und Raum.quelle
exists()/createNewFile()
Sequenzen sind buchstäblich eine Verschwendung von Zeit und Raum.Nur eine Zeile!
path
undline
sind Saitenquelle
lines
. Wenn dies der Fall istjava.lang.String
, werden beim AufrufengetBytes()
Bytes mit der Standardcodierung der Plattform erzeugt , was im allgemeinen Fall nicht sehr gut ist.Der einfachste Weg, den ich finden kann:
Es wird wahrscheinlich nur für 1.7+ funktionieren.
quelle
Für Java 7+ ist es einen Versuch wert:
Es sieht vielversprechend aus ...
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
Lesen und Schreiben von Dateien mithilfe von Eingabe- und Ausgabestream:
quelle
Fügen Sie einfach dieses Paket hinzu:
Und dann können Sie diesen Code verwenden, um die Datei zu schreiben:
quelle
Verwenden Sie in Java 8 "Dateien und Pfade" und das Konstrukt "Try-with-Resources".
quelle
Es gibt einige einfache Möglichkeiten, wie:
quelle
bw
wird nicht verwendet.Sie können sogar eine temporäre Datei mithilfe einer Systemeigenschaft erstellen , die unabhängig von dem verwendeten Betriebssystem ist.
quelle
Mit der Guava-Bibliothek von Google können wir sehr einfach eine Datei erstellen und in diese schreiben.
Im Beispiel wird eine neue
fruits.txt
Datei im Projektstammverzeichnis erstellt.quelle
Sammlung mit Kunden lesen und in Datei speichern, mit JFilechooser.
quelle
Es gibt mindestens mehrere Möglichkeiten, eine Datei zu erstellen und in diese zu schreiben:
Kleine Dateien (1.7)
Sie können eine der Schreibmethoden verwenden, um Bytes oder Zeilen in eine Datei zu schreiben.
Diese Methoden erledigen den größten Teil der Arbeit für Sie, z. B. das Öffnen und Schließen des Streams, sind jedoch nicht für die Verarbeitung großer Dateien vorgesehen.
Schreiben einer größeren Datei mithilfe von gepufferten Stream-E / A. (1.7)
Das
java.nio.file
Paket unterstützt Kanal-E / A, die Daten in Puffern verschieben und einige der Ebenen umgehen, die Stream-E / A-Engpässe verursachen können.Dieser Ansatz ist aufgrund seiner effizienten Leistung besonders bei der Ausführung einer großen Anzahl von Schreibvorgängen bevorzugt. Gepufferte Operationen haben diesen Effekt, da sie nicht für jedes einzelne Byte die Schreibmethode des Betriebssystems aufrufen müssen, wodurch kostspielige E / A-Operationen reduziert werden.
Verwenden der NIO-API zum Kopieren (und Erstellen einer neuen) einer Datei mit einem Outputstream (1.7)
Es gibt auch zusätzliche Methoden, mit denen alle Bytes aus einem Eingabestream in eine Datei kopiert werden können.
FileWriter (Text) (<1,7)
Schreibt direkt in eine Datei (weniger Leistung) und sollte nur verwendet werden, wenn die Anzahl der Schreibvorgänge geringer ist. Wird verwendet, um zeichenorientierte Daten in eine Datei zu schreiben.
FileOutputStream (binär) (<1,7)
FileOutputStream ist zum Schreiben von Streams von Rohbytes wie Bilddaten gedacht.
Bei diesem Ansatz sollte in Betracht gezogen werden, immer ein Array von Bytes zu schreiben, anstatt jeweils ein Byte zu schreiben. Die Beschleunigung kann erheblich sein - bis zu 10-mal höher oder höher. Daher wird empfohlen, die
write(byte[])
Methoden nach Möglichkeit zu verwenden.quelle