Bagaimana cara membuat file baru bersama dengan direktori induk yang hilang?


99

Ketika menggunakan

file.createNewFile();

Saya mendapatkan pengecualian berikut

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

Saya bertanya-tanya apakah ada createNewFile yang membuat direktori induk yang hilang?

Jawaban:


150

Sudahkah kamu mencobanya?

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

Saya tidak tahu satu pemanggilan metode yang akan melakukan ini, tetapi itu cukup mudah seperti dua pernyataan.


Ini hanya berfungsi jika file dibuat dengan string jalur yang berisi direktori induk, yaitu new File("file.txt").getParentFile()mengembalikan null, new File("dir/file.txt").getParentFile()mengembalikan sama sepertinew File("dir")
Zoltán

1
Benar, Anda tidak perlu mkdirsjika file yang Anda coba buat tidak ada dalam direktori yang tidak ada, tetapi kasus penggunaan saya adalah saya membuat banyak file, beberapa di antaranya memiliki direktori induk, sementara yang lain tidak.
Zoltán

14

Jawaban Jon berfungsi jika Anda yakin bahwa jalur string yang Anda gunakan untuk membuat file termasuk direktori induk, yaitu jika Anda yakin bahwa jalur tersebut dalam bentuk <parent-dir>/<file-name>.

Jika tidak, yaitu jalur relatif dari bentuk <file-name>, maka getParentFile()akan kembali null.

Misalnya

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`.

Jadi, jika jalur file Anda mungkin atau mungkin tidak menyertakan direktori induk, Anda lebih aman dengan kode berikut:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();

karena banyak alasan, Anda harus selalu menyertakan jalur. Bagaimana lagi sistem harus tahu di mana Anda ingin meletakkan file itu?
NikkyD

@NikkyD Maaf, saya tidak begitu mengerti komentar Anda. Dalam jawaban saya, saya tidak mengatakan Anda tidak menyertakan jalur, tetapi jalur yang dilewati mungkin tidak termasuk direktori induk . Ada juga contoh jalan seperti itu dalam jawaban.
Zoltán

9

Mulai java7, Anda juga dapat menggunakan NIO2 API:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.