如何在Java中创建当前工作目录内的目录?

7

如果当前Java应用程序的工作目录下不存在名为“Foo”的目录,那么最简洁的方法是什么来创建它?

或者稍微换个角度:在Java中,如何实现与.NET中Directory.CreateDirectory("Foo")相同的功能?


你提出了一个问题,然后立即发布了自己的答案? - KLE
4
可以发布自己的问题和答案。这有助于社区,并且对将来的参考很有用。如果人们不同意你的答案,他们可以提供更好的答案。在 Meta SO 上进行快速搜索似乎也认同这一点。 - Iain
回复我之前的评论:http://meta.stackexchange.com/questions/12513/stackoverflow-should-i-answer-my-own-question-or-not - Iain
5
+1 在 http://stackoverflow.com/faq 顶部也有这个规定。"自问自答"是完全可以的,但要像参加 "危险边缘" 节目一样,把问题陈述成问题的形式。 - Alexander Pogrebnyak
我改正了!-1已被移除。 - Alex Feinman
显示剩余2条评论
2个回答

11

Java的 io 包没有 Directory 类,但是您可以使用File类上的mkdir()方法代替:

(new File("Foo")).mkdir()
请注意mkdir()有两种不同的失败模式:
  1. 如果存在安全管理器并且其checkWrite()方法不允许创建指定的目录,则会抛出SecurityException异常。
  2. 如果操作由于其他原因而失败,则mkdir()将返回false。(更具体地说,它将仅在目录已创建时返回true。)
第一点是可以的-如果您没有权限,则抛出异常。第二点有三个小缺点:
  1. 您需要检查此方法的布尔结果。如果忽略结果,则操作可能会悄悄失败。
  2. 如果返回false,则不知道操作失败的原因,这使得恢复或制定有意义的错误消息变得困难。
  3. 契约的严格“当且仅当”措辞还意味着该方法在目录已经存在时返回false。
另外:

与.NET的Directory.CreateDirectory()行为进行对比,如果目录存在,则什么也不做。这种行为是有道理的——“创建一个目录”;“好的,目录被创建了”。它是否现在或之前创建并不重要;通过此过程还是另一个过程?如果你真的关心这一点,你会问一个不同的问题:“这个目录存在吗?”

下一个警告是mkdir()一次不会创建多个目录。对于我所示例的名为“Foo”的目录,这很好;但是,如果您想在目录Foo内创建一个名为Bar的目录(即创建目录“Foo / Bar”),则必须记得改用mkdirs()方法。
因此,要避免所有这些警告,可以使用以下类似的辅助方法:
public static File createDirectory(String directoryPath) throws IOException {
    File dir = new File(directoryPath);
    if (dir.exists()) {
        return dir;
    }
    if (dir.mkdirs()) {
        return dir;
    }
    throw new IOException("Failed to create directory '" + dir.getAbsolutePath() + "' for an unknown reason.");
}

你提出了一个问题,然后立即发布了自己的答案? - Brian Agnew
5
以前见过这种情况,用户发布问题和答案的组合,旨在提供一个全面的答案来解决某些看似简单但实际上需要指导的问题,并引导那些还不知道如何解决该问题的人到他自己的答案。在我看来完全可以接受,尽管有点令人困惑。 - Esko
1
啊,现在我知道了Stackoverflow愿景(http://sstatic.net/so/Img/stackoverflow-venn-diagram.png)中“博客”部分的来源 :) - sfussenegger

1

我看到了你的createDirectory方法的一种更简洁的形式:

File f = new File(xyz);
if (!f.exists() && !f.mkdirs()) throw new IOException("Could not create directory " + f);

检查一下 f 是否存在,但不是一个目录也是值得的。


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