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?

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.


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();

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);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.