Jak utworzyć nowy plik z brakującymi katalogami nadrzędnymi?


99

Podczas używania

file.createNewFile();

Mam następujący wyjątek

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

Zastanawiam się, czy istnieje plik createNewFile, który tworzy brakujące katalogi nadrzędne?

Odpowiedzi:


150

Czy próbowałeś tego?

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

Nie znam ani jednego wywołania metody, które to zrobi, ale jest to całkiem proste jak dwie instrukcje.


Działa to tylko wtedy, gdy plik został utworzony ze ścieżką, która zawiera katalog nadrzędny, tj. new File("file.txt").getParentFile()Zwraca null, new File("dir/file.txt").getParentFile()zwraca to samo, conew File("dir")
Zoltán

1
To prawda, że ​​nie potrzebujesz, mkdirsjeśli plik, który próbujesz utworzyć, nie znajduje się w nieistniejącym katalogu, ale moim przypadkiem użycia jest to, że tworzę wiele plików, z których niektóre mają katalogi nadrzędne, a inne nie.
Zoltán

14

Odpowiedź Jona działa, jeśli masz pewność, że ścieżka, za pomocą której tworzysz plik, zawiera katalogi nadrzędne, tj. Jeśli masz pewność, że ścieżka ma postać <parent-dir>/<file-name>.

Jeśli tak nie jest, tzn. Jest to ścieżka względna formularza <file-name>, to getParentFile()wróci null.

Na przykład

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

Jeśli więc ścieżka do pliku może zawierać katalogi nadrzędne lub nie, bezpieczniej jest używać następującego kodu:

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

z wielu powodów zawsze powinieneś uwzględniać ścieżkę. Jak inaczej system miałby wiedzieć, gdzie chcesz umieścić ten plik?
NikkyD

@NikkyD Przepraszam, nie do końca rozumiem twój komentarz. W mojej odpowiedzi nie mówię, że nie dołączasz ścieżki, ale że przekazana ścieżka może nie zawierać katalogów nadrzędnych . W odpowiedzi jest też przykład takiej ścieżki.
Zoltán

9

Od wersji java7 możesz również korzystać z NIO2 API:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.