486

How do I create Directory/folder?

Once I have tested System.getProperty("user.home");

I have to create a directory (directory name "new folder" ) if and only if new folder does not exist.

2
  • 32
    please review your selection of the correct answer. The solution proposed by JigarJoshi is misleading. It doesn't address the problem correctly (see my comment). The (simple) solution proposed by Bozho is much better.
    – mwhs
    Commented Nov 24, 2013 at 11:36
  • mkdir is idempotent in java. The implementation will do the check if the directory exists for you, and only create it if it does not exist.
    – mwhs
    Commented Jul 21, 2015 at 12:51

16 Answers 16

618
new File("/path/directory").mkdirs();

Here "directory" is the name of the directory you want to create/exist.

7
  • 37
    Much better answer than the one selected as the correct one by the OP. Checking for existence of the directory before creating it should become a well-known anti-pattern.
    – mwhs
    Commented Nov 24, 2013 at 11:30
  • 9
    what if the directory is already exists? It would do overwriting? or skip the process. Commented Oct 8, 2015 at 5:34
  • 3
    @AvinashRaj please check docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs()
    – Tascalator
    Commented Oct 22, 2015 at 1:12
  • 7
    it is clear: Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
    – xeruf
    Commented Jun 11, 2017 at 15:29
  • 3
    It won't overwrite an existing directory. It will return false.
    – DarkHark
    Commented Oct 30, 2018 at 18:20
564

After ~7 year, I will update it to better approach which is suggested by Bozho.

File theDir = new File("/path/directory");
if (!theDir.exists()){
    theDir.mkdirs();
}
10
  • 279
    -1: That is actually a really bad technique to create a directory. The access to the FS is not reserved to a dedicated resource. Between if(!theDir.exists()) and theDir.mkdir() the status could have changed, as well as it could change in between not creating the directory (because of exists returning true) and needing it. The result of the method exists should never be used to decide wether to create a directory or not. Just call mkdir, no exception will be thrown if it already exists.
    – mwhs
    Commented Nov 24, 2013 at 11:26
  • 6
    @mwhs I understand that it's better to not check for the directory but I don't understand your justification (second part). Can't the status change between calling mkdir and needing the directory as well? I assume you meant that some other process deletes the directory.
    – Episodex
    Commented Jul 17, 2015 at 12:54
  • 2
    @Episodex Directories are shared resources. Just don't use the above solution, it is wrong for different reasons. Unclear how the PO could have thought this is the correct answer. If you want assertions about IO resources you need to use locks, not booleans.
    – mwhs
    Commented Jul 20, 2015 at 9:27
  • 54
    @mhws I know this post is a couple months old but if you look at the mkdirs implementation, from the source code, the very first thing that gets called is if (exists()) { return false; }. The implementation itself checks first to see if the directory already exists so the only thing this answer is at fault for, perhaps, is checking that condition 2x. Not near as bad as you're making it out to be. Commented Nov 12, 2015 at 20:59
  • 6
    As of Java 7, you should probably use the methods in Files as in the more recent answer by Benoit Blanchon. (This answer appears to have been written before Java 7.)
    – Brick
    Commented Sep 8, 2016 at 16:58
203

With Java 7, you can use Files.createDirectories().

For instance:

Files.createDirectories(Paths.get("/path/to/directory"));
6
  • 18
    I think this option didn't exist at the time of the original Q&A, but this should be the answer going forward, I think.
    – Brick
    Commented Sep 8, 2016 at 16:56
  • 12
    It would also be good to note that: Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
    – Keith OYS
    Commented Nov 12, 2017 at 11:23
  • 1
    Thanks for pointing the difference btw createDirectory and createDirectories. I find it a poor naming choice.
    – seinecle
    Commented Jun 6, 2018 at 12:28
  • (2019) I used Files.createDirectory(Paths.get(directory.toString())); where directory is a File object. Don't forget to catch your IOException
    – chrips
    Commented Feb 28, 2019 at 5:49
  • @chrips It is better to do directory.toPath() then. Commented May 14, 2020 at 7:39
38

You can try FileUtils#forceMkdir

FileUtils.forceMkdir("/path/directory");

This library have a lot of useful functions.

3
  • 1
    Much better than pure mkdirs: handles concurrency, checks if the operation succeeded, checks if the directory (not a file!) exists.
    – Andrey
    Commented May 6, 2015 at 11:26
  • 1
    Where does it say it handles concurrency? I actually tried to find it before I read this, looking for a way to let several threads manipulate filesystem without messing up.
    – brat
    Commented Mar 1, 2021 at 12:15
  • Use the source Luke
    – ahvargas
    Commented Oct 19, 2021 at 16:19
34

mkdir vs mkdirs


If you want to create a single directory use mkdir

new File("/path/directory").mkdir();

If you want to create a hierarchy of folder structure use mkdirs

 new File("/path/directory").mkdirs();
0
26

For java 7 and up:

Path path = Paths.get("/your/path/string");
Files.createDirectories(path);

It seems unnecessary to check for existence of the dir or file before creating, from createDirectories javadocs:

Creates a directory by creating all nonexistent parent directories first. Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists. The attrs parameter is optional file-attributes to set atomically when creating the nonexistent directories. Each file attribute is identified by its name. If more than one attribute of the same name is included in the array then all but the last occurrence is ignored.

If this method fails, then it may do so after creating some, but not all, of the parent directories.

25
  1. Create a single directory.

    new File("C:\\Directory1").mkdir();
    
  2. Create a directory named “Directory2 and all its sub-directories “Sub2″ and “Sub-Sub2″ together.

    new File("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()
    

Source: this perfect tutorial , you find also an example of use.

0
8

The following method should do what you want, just make sure you are checking the return value of mkdir() / mkdirs()

private void createUserDir(final String dirName) throws IOException {
    final File homeDir = new File(System.getProperty("user.home"));
    final File dir = new File(homeDir, dirName);
    if (!dir.exists() && !dir.mkdirs()) {
        throw new IOException("Unable to create " + dir.getAbsolutePath();
    }
}
1
  • 3
    As mentioned in the comment by @mwhs on Jigar Joshi's answer, checking for existence first is not only not necessary but actually a bad idea.
    – Bdoserror
    Commented Nov 25, 2014 at 20:56
5

Neat and clean:

import java.io.File;

public class RevCreateDirectory {

    public void revCreateDirectory() {
        //To create single directory/folder
        File file = new File("D:\\Directory1");
        if (!file.exists()) {
            if (file.mkdir()) {
                System.out.println("Directory is created!");
            } else {
                System.out.println("Failed to create directory!");
            }
        }
        //To create multiple directories/folders
        File files = new File("D:\\Directory2\\Sub2\\Sub-Sub2");
        if (!files.exists()) {
            if (files.mkdirs()) {
                System.out.println("Multiple directories are created!");
            } else {
                System.out.println("Failed to create multiple directories!");
            }
        }

    }
}
3

Though this question has been answered. I would like to put something extra, i.e. if there is a file exist with the directory name that you are trying to create than it should prompt an error. For future visitors.

public static void makeDir()
{
    File directory = new File(" dirname ");
    if (directory.exists() && directory.isFile())
    {
        System.out.println("The dir with name could not be" +
        " created as it is a normal file");
    }
    else
    {
        try
        {
            if (!directory.exists())
            {
                directory.mkdir();
            }
            String username = System.getProperty("user.name");
            String filename = " path/" + username + ".txt"; //extension if you need one

        }
        catch (IOException e)
        {
            System.out.println("prompt for error");
        }
    }
}
1
  • 4
    As mentioned in the comment by @mwhs on Jigar Joshi's answer, checking for existence first is not only not necessary but actually a bad idea.
    – Bdoserror
    Commented Nov 25, 2014 at 20:57
3

Just wanted to point out to everyone calling File.mkdir() or File.mkdirs() to be careful the File object is a directory and not a file. For example if you call mkdirs() for the path /dir1/dir2/file.txt, it will create a folder with the name file.txt which is probably not what you wanted. If you are creating a new file and also want to automatically create parent folders you can do something like this:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }
0
1

This the way work for me do one single directory or more or them: need to import java.io.File;
/*enter the code below to add a diectory dir1 or check if exist dir1, if does not, so create it and same with dir2 and dir3 */

    File filed = new File("C:\\dir1");
    if(!filed.exists()){  if(filed.mkdir()){ System.out.println("directory is created"); }} else{ System.out.println("directory exist");  }

    File filel = new File("C:\\dir1\\dir2");
    if(!filel.exists()){  if(filel.mkdir()){ System.out.println("directory is created");   }} else{ System.out.println("directory exist");  }

    File filet = new File("C:\\dir1\\dir2\\dir3");
    if(!filet.exists()){  if(filet.mkdir()){ System.out.println("directory is  created"); }}  else{ System.out.println("directory exist");  }
1

if you want to be sure its created then this:

final String path = "target/logs/";
final File logsDir = new File(path);
final boolean logsDirCreated = logsDir.mkdir();
if (!logsDirCreated) {
    final boolean logsDirExists = logsDir.exists();
    assertThat(logsDirExists).isTrue();
}

beacuse mkDir() returns a boolean, and findbugs will cry for it if you dont use the variable. Also its not nice...

mkDir() returns only true if mkDir() creates it. If the dir exists, it returns false, so to verify the dir you created, only call exists() if mkDir() return false.

assertThat() will checks the result and fails if exists() returns false. ofc you can use other things to handle the uncreated directory.

0

This function allows you to create a directory on the user home directory.

private static void createDirectory(final String directoryName) {
    final File homeDirectory = new File(System.getProperty("user.home"));
    final File newDirectory = new File(homeDirectory, directoryName);
    if(!newDirectory.exists()) {
        boolean result = newDirectory.mkdir();

        if(result) {
            System.out.println("The directory is created !");
        }
    } else {
        System.out.println("The directory already exist");
    }
}
1
  • As mentioned in the comment by @mwhs on Jigar Joshi's answer, checking for existence first is not only not necessary but actually a bad idea.
    – Bdoserror
    Commented Nov 25, 2014 at 20:58
0

You can use the Short Circuit OR feature in an 'if' statement. This feature allows you to check if a directory exists and create it in a single line of code, as shown in this example:

public File checkAndMakeTheDirectory() {
  File theDirectory = new File("/path/directory");
  if (theDirectory.exists() || theDirectory.mkdirs())
    System.out.println("The folder has been created or already exists");
  return theDirectory;
}

The 'if' statement in Java has a useful feature known as Short Circuit Evaluation. If the first part of the 'if' statement is true, then the second part will not be evaluated. Conversely, if the first part is false, then the second part will still be evaluated.

-2
public class Test1 {
    public static void main(String[] args)
    {
       String path = System.getProperty("user.home");
       File dir=new File(path+"/new folder");
       if(dir.exists()){
           System.out.println("A folder with name 'new folder' is already exist in the path "+path);
       }else{
           dir.mkdir();
       }

    }
}
1
  • As mentioned in the comment by @mwhs on Jigar Joshi's answer, checking for existence first is not only not necessary but actually a bad idea.
    – Bdoserror
    Commented Nov 25, 2014 at 20:57

Not the answer you're looking for? Browse other questions tagged or ask your own question.