Como criar um novo arquivo com diretórios pais ausentes?

98

Ao usar

file.createNewFile();

Eu recebo a seguinte exceção

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

Gostaria de saber se existe um createNewFile que cria os diretórios pai ausentes?

Pentium10
fonte

Respostas:

150

Você já tentou isso?

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

Não conheço uma única chamada de método que faça isso, mas é muito fácil como duas instruções.

Jon Skeet
fonte
Isso só funciona se o arquivo foi criado com uma seqüência de caminho que contém um diretório pai, isto é, new File("file.txt").getParentFile()retorna null, new File("dir/file.txt").getParentFile()retorna o mesmo quenew File("dir")
Zoltán
1
É verdade que você não precisa mkdirsse o arquivo que está tentando criar não estiver em um diretório inexistente, mas meu caso de uso é que estou criando vários arquivos, alguns dos quais têm diretórios pais, enquanto outros não.
Zoltán
14

A resposta de Jon funciona se você tiver certeza de que a string do caminho com a qual você está criando um arquivo inclui diretórios pais, ou seja, se você tiver certeza de que o caminho está no formato <parent-dir>/<file-name>.

Caso contrário, ou seja, se for um caminho relativo do formulário <file-name>, ele getParentFile()retornará null.

Por exemplo

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

Portanto, se o caminho do arquivo pode ou não incluir diretórios pais, você estará mais seguro com o seguinte código:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();
Zoltán
fonte
por vários motivos, você deve sempre incluir um caminho. De que outra forma o sistema deve saber onde você deseja colocar esse arquivo?
NikkyD
@NikkyD Sinto muito, não entendi muito bem seu comentário. Em minha resposta, não estou dizendo que você não está incluindo um caminho, mas que o caminho passado pode não incluir os diretórios pais . Também há um exemplo desse caminho na resposta.
Zoltán,
7

A partir do java7, você também pode usar a API NIO2:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Ted
fonte