如何在Java中创建一个目录?

476

如何创建目录/文件夹?

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

如果"new folder"不存在,我必须创建一个名为"new folder"的目录。


31
请检查你选择的正确答案。JigarJoshi提出的解决方案是具有误导性的,它没有正确地解决问题(请看我的评论)。Bozho提出的(简单)解决方案更好。 - mwhs
mkdir 在 Java 中是幂等的。实现会检查目录是否存在,仅在不存在时才创建它。 - mwhs
16个回答

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

这里的"directory"是你想要创建或存在的目录的名称。


37
比起被提问者选择的那个答案,这个回答要好得多。在创建目录之前检查其是否存在应成为一个众所周知的反范式。 - mwhs
8
如果目录已经存在,会发生什么情况?会覆盖原有目录还是跳过该过程? - Avinash Raj
3
@AvinashRaj请查看http://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs() - Tascalator
7
清楚了:返回值为“true”仅当目录被创建且所有必要的父级目录也被创建,否则返回“false”。 - xeruf
3
不会覆盖现有的目录,而是返回 false。 - DarkHark
显示剩余2条评论

561

经过约7年时间,我将按照Bozho建议的更好方法进行更新。

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

276
这实际上是一种非常糟糕的创建目录的技巧。文件系统的访问不是专门保留给一个资源的。在if(!theDir.exists())theDir.mkdir()之间,状态可能已经发生了变化,也可能在创建目录(因为exists返回true)并需要它之间发生变化。方法exists的结果不应用于决定是否创建目录。只需调用mkdir,如果它已经存在,则不会抛出异常。 - mwhs
5
@mwhs 我明白不检查目录可能更好,但我不理解你的辩解(第二部分)。在调用mkdir和需要该目录之间,状态不能发生变化吗?我猜你的意思是其他进程删除了该目录。 - Episodex
2
@Episodex 目录是共享资源。只是不要使用上面的解决方案,因为它有不同的错误。不清楚 PO 怎么会认为这是正确的答案。如果你想对 IO 资源进行断言,你需要使用锁,而不是布尔值。 - mwhs
53
我知道这篇文章已经几个月了,但如果你看一下mkdirs的实现源代码,第一件事就是调用if (exists()) { return false; }。 实现本身首先检查目录是否已经存在,因此这篇答案唯一可能的问题可能是检查该条件2次。不像你所描述的那样糟糕。 - Michael Hogenson
6
从Java 7开始,你应该使用Files中的方法,就像Benoit Blanchon在最新的答案中所示。 (这个答案似乎是在Java 7之前编写的。) - Brick
显示剩余5条评论

196

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

例如:

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

17
我认为在原始问答的时候这个选项不存在,但我认为这将是未来的答案。 - Brick
11
还值得注意的是:与createDirectory方法不同的是,如果目录已经存在而无法创建,则不会抛出异常。 - Keith OYS
1
感谢您指出createDirectory和createDirectories之间的区别。我认为这是一个不好的命名选择。 - seinecle
(2019年)我使用了Files.createDirectory(Paths.get(directory.toString()));其中directory是一个File对象。不要忘记捕获您的IOException。 - chrips
@chrips 最好使用 directory.toPath() - Ruslan Stelmachenko
完美无缺的答案! - Gaurav

38
你可以尝试使用FileUtils#forceMkdir
FileUtils.forceMkdir("/path/directory");

这个有许多有用的函数。


1
比纯mkdirs好得多:处理并发,检查操作是否成功,检查目录(而不是文件!)是否存在。 - Andrey
1
它在哪里说它处理并发?实际上,在阅读这篇文章之前,我就试图找到它,寻找一种让多个线程操作文件系统而不会出错的方法。 - brat
使用 源代码 Luke。 - ahvargas

32

mkdir和mkdirs的区别


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

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

如果您想创建一个文件夹层次结构,请使用 mkdirs

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

25
  1. 创建一个单一的目录。

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

来源:这篇完美的教程,你也可以在其中找到一个使用示例。


24

对于Java 7及以上版本:

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

在创建目录或文件之前检查其是否存在似乎是不必要的,来自createDirectories javadocs:

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

如果此方法失败,则可能在创建了一些但不是全部的父目录之后失败。


8
以下方法应该可以满足您的需求,只需确保检查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();
    }
}

3
如@mwhs在Jigar Joshi的回答中所述,在进行检查之前首先确认其是否存在不仅是不必要的,而且实际上是一个不好的想法。 - Bdoserror

5
整洁清晰:
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

提醒大家,如果你调用File.mkdir()File.mkdirs()方法,请注意File对象是目录而不是文件。例如,如果你为路径/dir1/dir2/file.txt调用mkdirs()方法,它将创建一个名为file.txt文件夹,这可能不是你想要的结果。如果你想要创建一个新文件并自动创建父文件夹,可以像下面这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接