Java FileOutputStream Datei erstellen, falls nicht vorhanden


187

Gibt es eine Möglichkeit, FileOutputStream so zu verwenden, dass eine Datei (String-Dateiname) erstellt wird, wenn sie nicht vorhanden ist?

FileOutputStream oFile = new FileOutputStream("score.txt", false);

Antworten:


302

Es wird ein ausgelöst, FileNotFoundExceptionwenn die Datei nicht vorhanden ist und nicht erstellt werden kann ( doc ), aber es wird erstellt, wenn dies möglich ist. Um sicherzugehen, sollten Sie wahrscheinlich zuerst testen, ob die Datei vorhanden ist, bevor Sie die erstellen FileOutputStream(und mit erstellen, createNewFile()wenn dies nicht der Fall ist):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 

2
Wie würde ich eine leere TXT-Datei erstellen, wenn die Datei nicht vorhanden ist?
Stefan Dunn

3
@StefanDunn mit der createNewFile()Methode, wie in meinem Beispiel gezeigt.
Talnicolas

55
Die Bedingung ist redundant. Nach JavaDoc , createNewFile()prüft selbst atomar die Existenz der Datei.
Aztek

8
@aztek wahrscheinlich könnten wir die Bedingung verlassen, um die Lesbarkeit des Codes zu verbessern
Andrii Chernenko

2
createNewFile()ist hier reine Zeitverschwendung. Das System wird das bereits tun. Sie zwingen es nur, zweimal hinzuschauen.
Marquis von Lorne

61

Vor dem Erstellen einer Datei müssen alle Verzeichnisse der Eltern erstellt werden.

Verwenden yourFile.getParentFile().mkdirs()


23

Sie können eine leere Datei erstellen, unabhängig davon, ob sie vorhanden ist oder nicht ...

new FileOutputStream("score.txt", false).close();

Wenn Sie die Datei verlassen möchten, falls vorhanden ...

new FileOutputStream("score.txt", true).close();

Sie erhalten nur dann eine FileNotFoundException, wenn Sie versuchen, die Datei in einem nicht vorhandenen Verzeichnis zu erstellen.


3
Es wirft FileNotFoundExceptionin beiden Fällen.
Mixel

21
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}

Geben Sie dies fan Ihren FileOutputStreamKonstruktor weiter.


2
Hier gibt es eine Rennbedingung ... Besser wie folgt: Datei f = neue Datei ("Test.txt"); if (! f.createNewFile ()) {System.out.println ("Datei existiert bereits"); }
Menschheit

19

FileUtils von Apache Commons ist ein ziemlich guter Weg, um dies in einer einzigen Zeile zu erreichen.

FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))

Dadurch werden übergeordnete Ordner erstellt, wenn sie nicht vorhanden sind, und eine Datei erstellt, wenn sie nicht vorhanden ist, und eine Ausnahme ausgelöst, wenn das Dateiobjekt ein Verzeichnis ist oder nicht beschrieben werden kann. Dies entspricht :

File file = new File("/home/nikhil/somedir/file.txt");
file.getParentFile().mkdirs(); // Will create parent directories if not exists
file.createNewFile();
FileOutputStream s = new FileOutputStream(file,false);

Alle oben genannten Vorgänge lösen eine Ausnahme aus, wenn der aktuelle Benutzer den Vorgang nicht ausführen darf.


4

Datei erstellen, falls nicht vorhanden. Wenn die Datei beendet wird, löschen Sie ihren Inhalt:

/**
 * Create file if not exist.
 *
 * @param path For example: "D:\foo.xml"
 */
public static void createFile(String path) {
    try {
        File file = new File(path);
        if (!file.exists()) {
            file.createNewFile();
        } else {
            FileOutputStream writer = new FileOutputStream(path);
            writer.write(("").getBytes());
            writer.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2

Geben Sie nur eine alternative Möglichkeit zum Erstellen der Datei an, wenn diese nicht mithilfe von Pfad und Dateien vorhanden ist.

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());

0

Sie können möglicherweise eine erhalten, FileNotFoundExceptionwenn die Datei nicht vorhanden ist.

In der Java-Dokumentation heißt es:

Ob eine Datei verfügbar ist oder erstellt werden kann, hängt von der zugrunde liegenden Plattform http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html ab

Wenn Sie Java 7 verwenden, können Sie das Paket java.nio verwenden:

Der Parameter options gibt an, wie die Datei erstellt oder geöffnet wird. Er öffnet die Datei zum Schreiben und erstellt die Datei, falls sie nicht vorhanden ist.

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html


0

new FileOutputStream(f) In den meisten Fällen wird eine Datei erstellt, aber leider erhalten Sie eine FileNotFoundException

Wenn die Datei vorhanden ist, aber kein Verzeichnis, sondern ein Verzeichnis ist, nicht vorhanden ist, aber nicht erstellt oder aus einem anderen Grund nicht geöffnet werden kann

von Javadoc

Mit anderen Worten, es könnte viele Fälle geben, in denen Sie FileNotFoundException erhalten, was bedeutet, dass Ihre Datei nicht erstellt werden konnte, aber Sie konnten den Grund für das Fehlschlagen der Dateierstellung nicht finden.

Eine Lösung besteht darin, jeden Aufruf der Datei-API zu entfernen und stattdessen die Datei-API zu verwenden, da diese eine viel bessere Fehlerbehandlung bietet. Ersetzen Sie normalerweise alle new FileOutputStream(f)durch Files.newOutputStream(p).

In Fällen, in denen Sie die Datei-API verwenden müssen (weil Sie beispielsweise eine externe Schnittstelle mit Datei verwenden), ist die Verwendung Files.createFile(p)eine gute Möglichkeit, um sicherzustellen, dass Ihre Datei ordnungsgemäß erstellt wurde, und wenn nicht, wissen Sie, warum sie nicht funktioniert hat. Einige Leute haben oben kommentiert, dass dies überflüssig ist. Es ist wahr, aber Sie erhalten eine bessere Fehlerbehandlung, die in einigen Fällen erforderlich sein kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.