如何用Java创建目录?


386

如何创建目录/文件夹?

一旦我测试 System.getProperty("user.home");

当且仅当新文件夹不存在时,我才必须创建一个目录(目录名称为“ new folder”)。


24
请查看您对正确答案的选择。JigarJoshi提出的解决方案具有误导性。它不能正确解决问题(请参阅我的评论)。Bozho提出的(简单)解决方案要好得多。
mwhs

mkdir在Java中是幂等的。该实现将检查该目录是否为您存在,并且仅在不存在时创建它。
mwhs 2015年

Answers:


460

大约7年后,我将其更新为Bozho建议的更好方法。

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

不推荐使用:

File theDir = new File("new folder");

// if the directory does not exist, create it
if (!theDir.exists()) {
    System.out.println("creating directory: " + theDir.getName());
    boolean result = false;

    try{
        theDir.mkdir();
        result = true;
    } 
    catch(SecurityException se){
        //handle it
    }        
    if(result) {    
        System.out.println("DIR created");  
    }
}

240
-1:创建目录实际上是一种非常糟糕的技术。对FS的访问未保留给专用资源。之间if(!theDir.exists())和之间theDir.mkdir()的状态可能已更改,以及在创建目录(由于exists返回true)和需要它之间的状态也可能发生变化。该方法的结果exists绝不能用于决定是否创建目录。只需调用mkdir,就不会引发任何异常(如果已经存在)。
mwhs

4
@mwhs我知道最好不要检查目录,但是我不理解您的理由(第二部分)。状态也不能在调用mkdir和需要目录之间更改吗?我假设您的意思是其他一些进程删除了该目录。
Episodex

2
@Episodex目录是共享资源。只是不使用上述解决方案,由于不同的原因是错误的。不清楚采购专员如何认为这是正确的答案。如果要声明有关IO资源的信息,则需要使用锁,而不是布尔值。
mwhs 2015年

44
@mhws我知道这篇文章已有两个月的历史了,但是如果您mkdirs从源代码中看一下实现,首先要调用的是if (exists()) { return false; }。实现本身首先检查该目录是否已存在,因此此答案唯一有问题的地方可能就是检查2x条件。远没有你想像的那么糟糕。
Michael Hogenson 2015年

5
从Java 7开始,您可能应该使用FilesBenoit Blanchon的最新答案中的方法。(此答案似乎是在Java 7之前编写的。)
Brick

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

“目录”是您要创建/存在的目录的名称。


30
比OP选为正确答案的答案要好得多。在创建目录之前检查目录是否存在应该成为众所周知的反模式。
mwhs

7
如果目录已经存在怎么办?会覆盖吗?或跳过该过程。
阿维纳什·拉吉


1
@Tascalator尚无法从文档中详细说明吗?答案也应与问题答案相辅相成what if the directory is already exists? It would do overwriting? or skip the process.
mrgloom

3
很明显:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
Xerus

146

使用Java 7,您可以使用 Files.createDirectories()

例如:

Files.createDirectories(Paths.get("/path/to/directory"));

12
我认为在最初的问答时尚不存在此选项,但我认为这应该是未来的答案。

6
还要注意:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
Keith OYS

感谢您指出createDirectory和createDirectories之间的区别。我发现这是一个糟糕的命名选择。
塞纳河

(2019)我使用了Files.createDirectory(Paths.get(directory.toString())); 其中directory是一个File对象。别忘了捕捉您的IOException
chrips,

@chrips最好这样做directory.toPath()
Ruslan Stelmachenko


28

mkdir和mkdirs


如果要创建一个目录,请使用 mkdir

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

如果要创建文件夹结构的层次结构,请使用 mkdirs

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

21
  1. 创建一个目录。

    new File("C:\\Directory1").mkdir();
  2. 一起创建一个名为“ Directory2”及其所有子目录“ Sub2”和“ Sub-Sub2”的目录。

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

来源:这个完美的教程,您还会发现一个使用示例。


14

对于Java 7及更高版本:

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

似乎没有必要在createDirectories javadocs中创建目录或文件之前检查其是否存在:

通过首先创建所有不存在的父目录来创建目录。与createDirectory方法不同,如果由于目录已经存在而无法创建目录,则不会引发异常。attrs参数是可选的文件属性,用于在创建不存在的目录时自动进行设置。每个文件属性均由其名称标识。如果数组中包含多个同名属性,则将忽略除最后一次出现以外的所有属性。

如果此方法失败,则可以在创建一些而非全部父目录之后执行此操作。


7

下面的方法应该做您想要的,只是确保您正在检查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();
    }
}

2
正如@mwhs在关于Jigar Joshi的答案的评论中提到的那样,首先检查是否存在不仅不是必需的,而且实际上是一个坏主意。
Bdoserror 2014年

4

虽然已经回答了这个问题。我想添加一些额外的内容,即如果存在一个您要创建的目录名称的文件,它将提示错误。对于未来的访客。

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");
        }
    }
}

3
正如@mwhs在对Jigar Joshi的回答的评论中提到的那样,首先检查是否存在不仅不是必需的,而且实际上是一个坏主意。
Bdoserror 2014年

4

干净整洁:

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!");
            }
        }

    }
}

4

要在Java中创建目录/文件夹,我们有两种方法

如果不存在单个目录,此处的makedirectory方法将创建一个目录。

File dir = new File("path name");
boolean isCreated = dir.mkdir();

File dir = new File("path name");
boolean isCreated = dir.mkdirs();

在这里,makedirectories方法将创建文件对象表示的路径中缺少的所有目录。

例如,请参考下面的链接(解释得很好)。希望能帮助到你!! https://www.flowerbrackets.com/create-directory-java-program/


3

只是想向每个人指出来,File.mkdir()或者File.mkdirs()要小心该File对象是目录而不是文件。例如,如果您调用mkdirs()path /dir1/dir2/file.txt,它将创建一个名称可能不是您想要的文件夹file.txt。如果要创建新文件,并且还想自动创建父文件夹,则可以执行以下操作:

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

2

通过这种方式,我可以执行一个或多个目录,也可以执行一个目录:需要导入java.io.File;
/ *输入以下代码以添加目录dir1或检查dir1是否存在(如果不存在),因此请与dir2和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");  }

0

使用此功能可以在用户主目录上创建目录。

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");
    }
}

正如@mwhs在对Jigar Joshi的回答的评论中提到的那样,首先检查是否存在不仅不是必需的,而且实际上是一个坏主意。
Bdoserror 2014年

0

如果要确定其创建,则此操作:

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()返回一个布尔值,如果不使用该变量,findbug会为此哭泣。也不是很好...

mkDir()mkDir()创建后仅返回true 。如果该目录存在,则返回false,因此要验证您创建的目录,仅exists()mkDir()返回false时调用。

assertThat()将检查结果,如果exists()返回false则失败。ofc您可以使用其他东西来处理未创建的目录。


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

    }
}

正如@mwhs在对Jigar Joshi的回答的评论中提到的那样,首先检查是否存在不仅不是必需的,而且实际上是一个坏主意。
Bdoserror 2014年

-7

您还可以引用makdir()函数在所需的文件夹中创建新目录。


9
没有名为的方法makdir。如果您的意思是mkdir,这如何为现有答案添加任何内容?
泰德·霍普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.