Creación de directorios temporales en Java

1. Información general

Los directorios temporales son útiles cuando necesitamos crear un conjunto de archivos que luego podemos descartar. Cuando creamos directorios temporales, podemos delegar en el sistema operativo dónde ponerlos o especificarnos dónde queremos colocarlos.

En este breve tutorial, aprenderemos cómo crear directorios temporales en Java usando diferentes API y enfoques . Todos los ejemplos de este tutorial se realizarán utilizando Java 7+ simple, Guava y Apache Commons IO.

2. Delegado al Sistema Operativo

Uno de los enfoques más populares utilizados para crear directorios temporales es delegar el destino al sistema operativo subyacente. La ubicación la proporciona la propiedad java.io.tmpdir , y cada sistema operativo tiene su propia estructura y rutinas de limpieza.

En Java simple, creamos un directorio especificando el prefijo que queremos que tome el directorio:

String tmpdir = Files.createTempDirectory("tmpDirPrefix").toFile().getAbsolutePath(); String tmpDirsLocation = System.getProperty("java.io.tmpdir"); assertThat(tmpdir).startsWith(tmpDirsLocation);

Usando Guava, el proceso es similar, pero no podemos especificar cómo queremos prefijar nuestro directorio:

String tmpdir = Files.createTempDir().getAbsolutePath(); String tmpDirsLocation = System.getProperty("java.io.tmpdir"); assertThat(tmpdir).startsWith(tmpDirsLocation);

Apache Commons IO no proporciona una forma de crear directorios temporales. Proporciona un contenedor para obtener el directorio temporal del sistema operativo, y luego, depende de nosotros hacer el resto:

String tmpDirsLocation = System.getProperty("java.io.tmpdir"); Path path = Paths.get(FileUtils.getTempDirectory().getAbsolutePath(), UUID.randomUUID().toString()); String tmpdir = Files.createDirectories(path).toFile().getAbsolutePath(); assertThat(tmpdir).startsWith(tmpDirsLocation);

Para evitar conflictos de nombres con directorios existentes, usamos UUID.randomUUID () para crear un directorio con un nombre aleatorio.

3. Especificación de la ubicación

A veces necesitamos especificar dónde queremos crear nuestro directorio temporal. Un buen ejemplo es durante una compilación de Maven. Como ya tenemos un directorio de destino de compilación "temporal" , podemos hacer uso de ese directorio para colocar directorios temporales que nuestra compilación pueda necesitar:

Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix"); assertThat(tmpdir.toFile().getPath()).startsWith("target");

Tanto Guava como Apache Commons IO carecen de métodos para crear directorios temporales en ubicaciones específicas.

Vale la pena señalar que el directorio de destino puede ser diferente según la configuración de compilación . Una forma de hacerlo a prueba de balas es pasar la ubicación del directorio de destino a la JVM que ejecuta la prueba.

Como el sistema operativo no se ocupa de la limpieza, podemos hacer uso de File.deleteOnSalir () :

tmpdir.toFile().deleteOnExit();

De esta manera, el archivo se elimina una vez que la JVM termina, pero solo si la terminación es correcta .

4. Uso de diferentes atributos de archivo

Como cualquier otro archivo o directorio, es posible especificar atributos de archivo al crear un directorio temporal. Entonces, si queremos crear un directorio temporal que solo pueda ser leído por el usuario que lo crea, podemos especificar el conjunto de atributos que lograrán eso:

FileAttribute attrs = PosixFilePermissions.asFileAttribute( PosixFilePermissions.fromString("r--------")); Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix", attrs); assertThat(tmpdir.toFile().getPath()).startsWith("target"); assertThat(tmpdir.toFile().canWrite()).isFalse();

Como era de esperar, Guava y Apache Commons IO no proporcionan una forma de especificar los atributos al crear directorios temporales.

También vale la pena señalar que el ejemplo anterior asume que estamos bajo un sistema de archivos compatible con Posix como Unix o macOS.

Puede encontrar más información sobre los atributos de archivo en nuestra Guía de API de atributos de archivo NIO2.

5. Conclusión

En este breve tutorial, exploramos cómo crear directorios temporales en Java 7+ simple, Guava y Apache Commons IO. Vimos que Java simple es la forma más flexible de crear directorios temporales, ya que ofrece una gama más amplia de posibilidades manteniendo la verbosidad al mínimo.

Como de costumbre, todo el código fuente de este tutorial está disponible en GitHub.