How to create a temporary directory/folder in Java? How to create a temporary directory/folder in Java? java java

How to create a temporary directory/folder in Java?


If you are using JDK 7 use the new Files.createTempDirectory class to create the temporary directory.

Path tempDirWithPrefix = Files.createTempDirectory(prefix);

Before JDK 7 this should do it:

public static File createTempDirectory()    throws IOException{    final File temp;    temp = File.createTempFile("temp", Long.toString(System.nanoTime()));    if(!(temp.delete()))    {        throw new IOException("Could not delete temp file: " + temp.getAbsolutePath());    }    if(!(temp.mkdir()))    {        throw new IOException("Could not create temp directory: " + temp.getAbsolutePath());    }    return (temp);}

You could make better exceptions (subclass IOException) if you want.


The Google Guava library has a ton of helpful utilities. One of note here is the Files class. It has a bunch of useful methods including:

File myTempDir = Files.createTempDir();

This does exactly what you asked for in one line. If you read the documentation here you'll see that the proposed adaptation of File.createTempFile("install", "dir") typically introduces security vulnerabilities.


If you need a temporary directory for testing and you are using jUnit, @Rule together with TemporaryFolder solves your problem:

@Rulepublic TemporaryFolder folder = new TemporaryFolder();

From the documentation:

The TemporaryFolder Rule allows creation of files and folders that are guaranteed to be deleted when the test method finishes (whether it passes or fails)


Update:

If you are using JUnit Jupiter (version 5.1.1 or greater), you have the option to use JUnit Pioneer which is the JUnit 5 Extension Pack.

Copied from the project documentation:

For example, the following test registers the extension for a single test method, creates and writes a file to the temporary directory and checks its content.

@Test@ExtendWith(TempDirectory.class)void test(@TempDir Path tempDir) {    Path file = tempDir.resolve("test.txt");    writeFile(file);    assertExpectedFileContent(file);}

More info in the JavaDoc and the JavaDoc of TempDirectory

Gradle:

dependencies {    testImplementation 'org.junit-pioneer:junit-pioneer:0.1.2'}

Maven:

<dependency>   <groupId>org.junit-pioneer</groupId>   <artifactId>junit-pioneer</artifactId>   <version>0.1.2</version>   <scope>test</scope></dependency>

Update 2:

The @TempDir annotation was added to the JUnit Jupiter 5.4.0 release as an experimental feature. Example copied from the JUnit 5 User Guide:

@Testvoid writeItemsToFile(@TempDir Path tempDir) throws IOException {    Path file = tempDir.resolve("test.txt");    new ListWriter(file).write("a", "b", "c");    assertEquals(singletonList("a,b,c"), Files.readAllLines(file));}