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:
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.
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.
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();
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);
}
new File("file.txt").getParentFile()Zwracanull,new File("dir/file.txt").getParentFile()zwraca to samo, conew File("dir")