Java中java.io.File中的mkdir()和mkdirs()有什么区别?

143

有人能告诉我这两种方法的区别吗:

  • file.mkdir():创建此抽象路径名指定的目录。
  • file.mkdirs():创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

27
阅读Javadoc文档:mkdirmkdirs的区别。 - assylias
4
更新的做法是使用Files.createDirectories和Files.createDirectory静态方法:https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html - neves
在使用mkdir之后,您可能会收到“文件不受支持”的提示。 - Roman Soviak
这两者之间有性能差异吗?特别是当父目录已经存在时? - Joshua Pinter
3个回答

175

mkdirs()方法还会创建该File表示的路径中所有缺失的父级目录

mkdirs()的javadoc

创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。请注意,如果此操作失败,则可能已成功创建某些必需的父目录。

mkdir()的javadoc

创建由此抽象路径名命名的目录。

示例:

File  f = new File("non_existing_dir/someDir");
System.out.println(f.mkdir());
System.out.println(f.mkdirs());

第一个命令将返回false [不会创建任何目录],第二个命令将返回true,并且你将创建non_existing_dir/someDir

结果为:

第一个命令将返回false [不会创建任何目录],第二个命令将返回true,并且你将创建non_existing_dir/someDir


9
因为 Oracle 再次打破了互联网上的链接:mkdirs()mkdir() - MyPasswordIsLasercats
@MyPasswordIsLasercats 谢谢您告诉我,已经修复。 - amit
1
如果目录已经存在,mkdir() 函数会返回 true 还是 false?Javadoc 似乎没有涉及到这个方面。 - Arun
@Arun,根据Javadoc的说明,它返回“仅当目录被创建时才为真”,这可能是模棱两可的,无法确定是由此调用创建还是之前就已经存在了。这个答案表明是前者。 - Samuel Edwin Ward
在我的情况下,mkdir和mkdirs都返回false。如果我使用双反斜杠“\”它可以工作,但是:如果我在此之后使用“.toURI()”,我会收到:file:/Users/MyName/Desktop/%5Cnon_existing_dir%5CsomeDir/,如果我使用“.getPath()”,我会收到“\non_existing_dir\someDir”,如果我使用“.getCanonicalPath()”,我会收到/Users/MyName/Desktop/\non_existing_dir\someDir。 - Aerox
显示剩余2条评论

67

mkdirs()会创建指定的目录路径及其所有父目录,而mkdir()仅会创建最底层的目录,如果无法找到要创建目录的父目录,则失败。

换句话说,mkdir()类似于mkdir命令,而mkdirs()类似于mkdir -p命令。

例如,假设我们有一个空的/tmp目录。下面的代码

new File("/tmp/one/two/three").mkdirs();

会创建以下目录:

  • /tmp/one
  • /tmp/one/two
  • /tmp/one/two/three

这段代码如下:

new File("/tmp/one/two/three").mkdir();

如果找不到/tmp/one/two,则不会创建任何目录,并返回false


4
mkdir()

一次只能创建一个目录,如果是父目录则只创建父目录。否则,它可以创建子目录(仅当指定路径已存在)并且不会在任何两个目录之间创建任何目录。因此,它不能在一个目录中创建多个目录。

mkdirs()

在同一时间内创建多个目录(包括两个目录之间的目录)。

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