¿Cómo crear un nuevo archivo junto con los directorios principales que faltan?

98

Cuando usas

file.createNewFile();

Obtengo la siguiente excepción

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

Me pregunto si hay un createNewFile que crea los directorios principales que faltan.

Pentium10
fuente

Respuestas:

150

¿Has probado esto?

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

No conozco una sola llamada a un método que haga esto, pero es bastante fácil como dos declaraciones.

Jon Skeet
fuente
Esto sólo funciona si el archivo fue creado con una cadena de ruta que contiene un directorio principal, es decir, new File("file.txt").getParentFile()vuelve null, new File("dir/file.txt").getParentFile()devuelve el mismo quenew File("dir")
Zoltán
1
Es cierto que no es necesario mkdirssi el archivo que está intentando crear no está en un directorio inexistente, pero mi caso de uso es que estoy creando varios archivos, algunos de los cuales tienen directorios principales, mientras que otros no.
Zoltán
14

La respuesta de Jon funciona si está seguro de que la cadena de ruta con la que está creando un archivo incluye directorios principales, es decir, si está seguro de que la ruta tiene la forma <parent-dir>/<file-name>.

Si no es así, es decir, es una ruta relativa del formulario <file-name>, getParentFile()volverá null.

P.ej

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

Entonces, si su ruta de archivo puede incluir o no directorios principales, está más seguro con el siguiente código:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();
Zoltán
fuente
por muchas razones, siempre debe incluir una ruta. ¿De qué otra manera debería saber el sistema dónde desea colocar ese archivo?
NikkyD
@NikkyD Lo siento, no entiendo bien tu comentario. En mi respuesta, no estoy diciendo que no esté incluyendo una ruta, pero que la ruta pasada puede no incluir directorios principales . También hay un ejemplo de este camino en la respuesta.
Zoltán
7

A partir de java7, también puede utilizar la API NIO2:

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