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);
Stefan Dunn
quelle

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); 
Talnicolas
quelle
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()

Kostiantyn Medvid
quelle
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.

Peter Lawrey
quelle
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.

Shashank Kadne
quelle
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.

Nikhil Sahu
quelle
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();
    }
}
Mach Nhu Vy
quelle
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());
Manish Bansal
quelle
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

Sikander
quelle
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.

Stapel übergelaufen
quelle