【问题标题】:How to create a directory in Java?如何在 Java 中创建目录?
【发布时间】:2011-04-07 18:49:18
【问题描述】:

如何创建目录/文件夹?

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

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

【问题讨论】:

  • 请检查您选择的正确答案。 JigarJoshi 提出的解决方案具有误导性。它没有正确解决问题(请参阅我的评论)。 Bozho提出的(简单)解决方案要好得多。
  • mkdir 在 java 中是幂等的。实现将为您检查目录是否存在,如果不存在则仅创建它。

标签: java directory


【解决方案1】:
new File("/path/directory").mkdirs();

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

【讨论】:

  • 比被 OP 选为正确答案的答案要好得多。在创建目录之前检查目录是否存在应该成为众所周知的反模式。
  • 如果目录已经存在怎么办?它会覆盖吗?或跳过该过程。
  • 很清楚:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
  • 它不会覆盖现有目录。它将返回 false。
【解决方案2】:

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

File theDir = new File("/path/directory");
if (!theDir.exists()){
    theDir.mkdirs();
}

【讨论】:

  • -1:这实际上是一种创建目录的非常糟糕的技术。对 FS 的访问不保留给专用资源。在if(!theDir.exists())theDir.mkdir() 之间,状态可能发生了变化,也可能在 创建目录(因为exists 返回true)和需要它之间发生变化。 exists 方法的结果永远不应该用来决定是否创建目录。只要调用mkdir,如果已经存在则不会抛出异常。
  • @mwhs 我知道最好不要检查目录,但我不明白你的理由(第二部分)。调用mkdir 和需要目录之间的状态不能改变吗?我假设您的意思是其他一些进程删除了该目录。
  • @Episodex 目录是共享资源。只是不要使用上述解决方案,由于不同的原因它是错误的。不清楚 PO 怎么会认为这是正确的答案。如果你想要关于 IO 资源的断言,你需要使用锁,而不是布尔值。
  • @mhws 我知道这篇文章已经有几个月的历史了,但是如果您查看源代码中的mkdirs 实现,首先调用的是if (exists()) { return false; }。实现本身首先检查目录是否已经存在,所以这个答案的唯一错误可能是检查条件 2x。没有你想象的那么糟糕。
  • 从 Java 7 开始,您可能应该使用 Files 中的方法,就像 Benoit Blanchon 最近的回答一样。 (这个答案似乎是在 Java 7 之前编写的。)
【解决方案3】:

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

【讨论】:

  • 正如@mwhs 对 Jigar Joshi 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是个坏主意。
【解决方案4】:

你可以试试FileUtils#forceMkdir

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

这个library有很多有用的功能。

【讨论】:

  • 比纯 mkdirs 好多了:处理并发,检查操作是否成功,检查目录(不是文件!)是否存在。
  • 它在哪里说它处理并发?在阅读本文之前,我实际上试图找到它,寻找一种让多个线程操作文件系统而不会搞砸的方法。
  • 使用source Luke
【解决方案5】:
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 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是个坏主意。
【解决方案6】:

虽然这个问题已经回答了。我想添加一些额外的东西,即 如果存在具有您尝试创建的目录名称的文件,则应该提示错误。对于未来的访客。

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

【讨论】:

  • 正如@mwhs 对 Jigar Joshi 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是个坏主意。
【解决方案7】:

此功能允许您在用户主目录上创建一个目录。

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 回答的评论中所提到的,首先检查是否存在不仅没有必要,而且实际上是个坏主意。
【解决方案8】:
  1. 创建一个目录。

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

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

来源:这个完美的tutorial,你也可以找到一个使用例子。

【讨论】:

    【解决方案9】:

    只是想向所有调用File.mkdir()File.mkdirs() 的人指出要小心File 对象是目录而不是文件。例如,如果您为路径/dir1/dir2/file.txt 调用mkdirs(),它将创建一个名为file.txt文件夹,这可能不是您想要的。如果您正在创建一个新文件并且还想自动创建父文件夹,您可以执行以下操作:

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

    【讨论】:

      【解决方案10】:

      mkdir 与 mkdirs


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

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

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

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

      【讨论】:

        【解决方案11】:

        干净整洁:

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

        【讨论】:

          【解决方案12】:

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

          例如:

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

          【讨论】:

          • 我认为这个选项在最初的问答时不存在,但我认为这应该是未来的答案。
          • 注意:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
          • 感谢您指出 createDirectory 和 createDirectories 的区别。我觉得这是一个糟糕的命名选择。
          • (2019) 我使用了 Files.createDirectory(Paths.get(directory.toString()));其中目录是一个文件对象。不要忘记捕捉你的 IOException
          • @chrips 那最好还是directory.toPath()
          【解决方案13】:

          这对我来说是一个或多个目录或它们的工作方式: 需要导入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");  }
          

          【讨论】:

            【解决方案14】:

            对于 Java 7 及更高版本:

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

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

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

            如果此方法失败,则它可能会在创建部分(但不是全部)父目录后这样做。

            【讨论】:

              【解决方案15】:

              在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/how-to-create-directory-java/

              【讨论】:

                【解决方案16】:

                如果你想确定它的创建,那么这个:

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

                因为mkDir() 返回一个布尔值,如果你不使用该变量,findbugs 会为它哭泣。也不好看……

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

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

                【讨论】:

                  猜你喜欢
                  • 2012-03-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-09-02
                  • 2010-10-20
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多