Wie erstelle ich eine neue Datei zusammen mit fehlenden übergeordneten Verzeichnissen?

98

Beim Benutzen

file.createNewFile();

Ich bekomme die folgende Ausnahme

java.io.IOException: Parent directory of file does not exist: /.../pkg/databases/mydb

Ich frage mich, ob es eine createNewFile gibt, die die fehlenden übergeordneten Verzeichnisse erstellt.

Pentium10
quelle

Antworten:

149

Hast du das versucht?

file.getParentFile().mkdirs();
file.createNewFile();

Ich kenne keinen einzigen Methodenaufruf, der dies erledigt, aber es ist ziemlich einfach als zwei Anweisungen.

Jon Skeet
quelle
Dies funktioniert nur, wenn die Datei mit einer Pfadzeichenfolge erstellt wurde, die ein übergeordnetes Verzeichnis enthält, dh new File("file.txt").getParentFile()zurückgibt null, new File("dir/file.txt").getParentFile()das gleiche zurückgibt wienew File("dir")
Zoltán
1
Es stimmt, brauchen Sie nicht , mkdirswenn die Datei , die Sie versuchen , erstellen nicht in einem nicht vorhandenen Verzeichnis ist, aber mein Anwendungsfall ist , dass ich mehrere Dateien erschaffe, einige übergeordnete Verzeichnisse von denen haben, während andere dies nicht tun.
Zoltán
14

Jons Antwort funktioniert, wenn Sie sicher sind, dass die Pfadzeichenfolge, mit der Sie eine Datei erstellen, übergeordnete Verzeichnisse enthält, dh wenn Sie sicher sind, dass der Pfad die Form hat <parent-dir>/<file-name>.

Wenn dies nicht der Fall ist, dh ein relativer Pfad des Formulars ist <file-name>, getParentFile()wird zurückgegeben null.

Z.B

File f = new File("dir/text.txt");
f.getParentFile().mkdirs();     // works fine because the path includes a parent directory.

File f = new File("text.txt");
f.getParentFile().mkdirs();     // throws NullPointerException because the parent file is unknown, i.e. `null`.

Wenn Ihr Dateipfad möglicherweise übergeordnete Verzeichnisse enthält oder nicht, sind Sie mit dem folgenden Code sicherer:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();
Zoltán
quelle
Aus vielen Gründen sollten Sie immer einen Pfad angeben. Woher sollte das System sonst wissen, wo Sie diese Datei ablegen möchten?
NikkyD
@NikkyD Es tut mir leid, ich verstehe Ihren Kommentar nicht ganz. In meiner Antwort sage ich nicht, dass Sie keinen Pfad einschließen, aber dass der übergebene Pfad möglicherweise keine übergeordneten Verzeichnisse enthält . Es gibt auch ein Beispiel für einen solchen Pfad in der Antwort.
Zoltán
7

Ab Java7 können Sie auch die NIO2-API verwenden:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Ted
quelle