Як створити новий файл разом із відсутніми батьківськими каталогами?


98

При використанні

file.createNewFile();

Я отримую наступний виняток

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

Мені цікаво, чи існує createNewFile, який створює відсутні батьківські каталоги?

Відповіді:


150

Ви пробували це?

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

Я не знаю жодного виклику методу, який би це зробив, але це досить просто, як два твердження.


Це працює лише в тому випадку, якщо файл був створений із рядком шляху, який містить батьківський каталог, тобто new File("file.txt").getParentFile()повертається null, new File("dir/file.txt").getParentFile()повертає те саме, щоnew File("dir")
Zoltán

1
Правда, вам не потрібно, mkdirsякщо файл, який ви намагаєтесь створити, не знаходиться в неіснуючому каталозі, але мій випадок використання полягає в тому, що я створюю кілька файлів, деякі з яких мають батьківські каталоги, а інші - ні.
Золтан,

14

Відповідь Джона працює, якщо ви впевнені, що рядок шляху, за допомогою якого ви створюєте файл, включає батьківські каталоги, тобто якщо ви впевнені, що шлях має форму <parent-dir>/<file-name>.

Якщо це не так, тобто це відносний шлях форми <file-name>, тоді getParentFile()повернеться null.

Напр

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

Отже, якщо шлях до вашого файлу може включати або не включати батьківські каталоги, ви безпечніші з таким кодом:

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

з багатьох причин ви завжди повинні включати шлях. Як ще система повинна знати, куди ви хочете помістити цей файл?
NikkyD

@NikkyD Вибачте, я не зовсім розумію ваш коментар. У своїй відповіді я не кажу, що ви не включаєте шлях, але що пройдений шлях може не включати батьківські каталоги . У відповіді також є приклад такого шляху.
Zoltán

7

Починаючи з java7, ви також можете використовувати API NIO2:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.