2009-10-12 86 views
6

在我的Java应用程序的当前工作目录下创建一个名为“Foo”的目录(如果它尚不存在),最简洁的方法是什么?如何在当前工作目录中创建一个目录,使用Java

或者,稍有不同:在.NET中,什么是Directory.CreateDirectory("Foo")的Java等价物?

+0

你问了一个问题,并立即发布自己的答案? – KLE 2009-10-12 12:27:48

+0

-1。看起来很奇怪发布一个问题和答案。堆栈溢出不是您要讲授的麦克风。 – 2009-10-12 12:37:40

+4

+1。发布自己的问题和答案并不错。帮助社区并为将来的参考提供帮助。如果人们不同意你的答案,那么他们可以提供更好的答案。 Meta SO上的*快速*搜索似乎同意这很好。 – Iain 2009-10-12 12:42:34

回答

7

java.io包不具有Directory类,但你可以使用mkdir()方法上File类,而不是:

(new File("Foo")).mkdir() 

注意mkdir()有两个独立的失效模式:

  1. “如果安全管理器存在且其checkWrite()方法不允许创建指定的目录”则将引发SecurityException
  2. 如果由于其他原因导致操作失败,mkdir()将返回false。 (更具体地说,它将返回当且仅当创建的目录真。)

1点是好的 - 如果你没有权限,扔掉。由于三个原因,点2有点次优:

  1. 您需要检查此方法的布尔结果。如果您忽略结果,操作可能会默默失败。
  2. 如果你得到一个虚假的回报,你不知道为什么操作失败,这很难恢复,或制定一个有意义的错误消息。
  3. 合同中严格的“if if if”用法也意味着如果该目录已经存在,则该方法返回false。

旁白:对比点3的.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."); 
} 
+0

你问了一个问题,并立即发布自己的答案? – 2009-10-12 12:24:54

+5

以前看过,这个想法是,发布问题+答案组合的用户想要对某个问题提出一个彻底的答案,这个问题在一个上下文中可能看起来很简单,该上下文将指导那些还不知道如何去做他的人自己的答案。在我看来完全可以接受,尽管有点混乱。 – Esko 2009-10-12 12:28:15

+1

啊,所以现在我知道Stackoverflow的愿景(http://sstatic.net/so/Img/stackoverflow-venn-diagram.png)的“Blog”部分来自:) – sfussenegger 2009-10-12 12:37:19

1

我看过你的createDirectory方法的稍微更简洁的形式:

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

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

相关问题