Как создать новый файл вместе с отсутствующими родительскими каталогами?

99

Когда используешь

file.createNewFile();

Я получаю следующее исключение

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

Мне интересно, есть ли createNewFile, который создает отсутствующие родительские каталоги?

Pentium10
источник

Ответы:

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если файл, который вы пытаетесь создать, находится не в несуществующем каталоге, но мой вариант использования заключается в том, что я создаю несколько файлов, некоторые из которых имеют родительские каталоги, а другие нет.
Zoltán
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 Извините, я не совсем понимаю ваш комментарий. В своем ответе я не говорю, что вы не включаете путь, но что пройденный путь может не включать родительские каталоги . В ответе также есть пример такого пути.
Золтан
9

Начиная с java7, вы также можете использовать NIO2 API:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Тед
источник