Creazione di directory temporanee in Java

1. Panoramica

Le directory temporanee sono utili quando dobbiamo creare un insieme di file che possiamo successivamente scartare. Quando creiamo directory temporanee, possiamo delegare al sistema operativo dove metterle o specificare noi stessi dove vogliamo posizionarle.

In questo breve tutorial, impareremo come creare directory temporanee in Java utilizzando API e approcci diversi . Tutti gli esempi in questo tutorial verranno eseguiti utilizzando Java 7+, Guava e Apache Commons IO.

2. Delegare al sistema operativo

Uno degli approcci più diffusi utilizzati per creare directory temporanee è delegare la destinazione al sistema operativo sottostante. La posizione è data dalla proprietà java.io.tmpdir e ogni sistema operativo ha la propria struttura e routine di pulizia.

In Java semplice, creiamo una directory specificando il prefisso che vogliamo che la directory prenda:

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

Usando Guava, il processo è simile, ma non possiamo specificare come vogliamo aggiungere il prefisso alla nostra directory:

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

Apache Commons IO non fornisce un modo per creare directory temporanee. Fornisce un wrapper per ottenere la directory temporanea del sistema operativo, quindi spetta a noi fare il 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);

Per evitare conflitti di nome con directory esistenti, utilizziamo UUID.randomUUID () per creare una directory con un nome casuale.

3. Specificare la posizione

A volte abbiamo bisogno di specificare dove vogliamo creare la nostra directory temporanea. Un buon esempio è durante una build di Maven. Poiché disponiamo già di una directory di destinazione della build "temporanea" , possiamo utilizzarla per posizionare le directory temporanee di cui la nostra build potrebbe aver bisogno:

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

Sia Guava che Apache Commons IO mancano di metodi per creare directory temporanee in posizioni specifiche.

Vale la pena notare che la directory di destinazione può essere diversa a seconda della configurazione della build . Un modo per renderlo a prova di proiettile è passare la posizione della directory di destinazione alla JVM che esegue il test.

Poiché il sistema operativo non si occupa della pulizia, possiamo utilizzare File.deleteOnExit () :

tmpdir.toFile().deleteOnExit();

In questo modo, il file viene eliminato una volta terminata la JVM, ma solo se la chiusura è regolare .

4. Utilizzo di attributi di file diversi

Come qualsiasi altro file o directory, è possibile specificare gli attributi del file al momento della creazione di una directory temporanea. Quindi, se vogliamo creare una directory temporanea che può essere letta solo dall'utente che la crea, possiamo specificare il set di attributi che lo faranno:

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

Come previsto, Guava e Apache Commons IO non forniscono un modo per specificare gli attributi durante la creazione di directory temporanee.

Vale anche la pena notare che l'esempio precedente presume che ci troviamo sotto un filesystem conforme a Posix come Unix o macOS.

Ulteriori informazioni sugli attributi dei file sono disponibili nella nostra Guida alle API degli attributi dei file NIO2.

5. conclusione

In questo breve tutorial, abbiamo esplorato come creare directory temporanee in Java 7+, Guava e Apache Commons IO. Abbiamo visto che Java semplice è il modo più flessibile per creare directory temporanee poiché offre una gamma più ampia di possibilità mantenendo al minimo la verbosità.

Come al solito, tutto il codice sorgente di questo tutorial è disponibile su GitHub.