【问题标题】:Is there a proper way to check for file/directory existence in Java?是否有适当的方法来检查 Java 中的文件/目录是否存在?
【发布时间】:2011-11-03 14:25:45
【问题描述】:

代码:

String dir = //Path to the  directory
File saveDir = new File(dir);
//Here comes the existence check
if(!saveDir.exists())
  saveDir.mkdirs();

这部分代码用于将具有给定目录路径的文件保存到文件系统。在保存之前,我想检查给定的保存目录是否存在。然而,存在检查似乎并没有按照我想要的方式工作。如果不删除 if 子句,则不会创建所需的目录。我在搜索我的问题时遇到了这个有趣的堆栈问题。 Alternative to File.exists() in Java。据我了解 java.io 有这个问题。

在进行文件操作时,是否有适当且安全的方法来检查目录或资源是否存在?

【问题讨论】:

  • 有点不相关,但只要你小心,你可能也应该检查isDirectory()

标签: java file-io


【解决方案1】:
new File(dir).getCanonicalFile().isDirectory();  

骨架供您参考:-

File f = new File("....");
if (!f.exists()) {
    // The directory does not exist.
    ...
} else if (!f.isDirectory()) {
    // It is not a directory (i.e. it is a file).
    ... 
}

【讨论】:

  • 又一个答案实例,有更多投票有用,而不是接受的答案。
【解决方案2】:

好吧,即使检查是正确的,您也永远无法确定在评估if 条件之后该目录仍然存在。另一个进程或用户可以创建/删除它。所以你必须检查操作是否失败(可能捕获适当的异常)。

因此,您不应依赖检查并总是期待最坏的情况。 (嗯,检查可能有助于防止您做一些不必要的事情,或要求用户确认等。但它们不保证任何事情。)

【讨论】:

  • 感谢您的回答。其余代码使用输入和输出流启动文件保存操作,因此需要处理或抛出 IOException。但我仍然不想让我的代码尝试为现有的代码调用目录创建方法。
  • @fga:好吧,如果目录突然出现/消失,那么无论如何都有问题发生。您的代码应该正确运行,并且如果一切顺利正常 不应抛出异常——但您必须处理出现错误 情况的异常。所以检查目录是否存在是可以的,因为它可以在正常的工作流程中工作。但是由于这个检查是不可靠的,你不能说你不能说不会抛出异常。
【解决方案3】:

只需拨打mkdirs。它不会真正覆盖现有目录,因此您的检查是不必要的(而且在任何情况下都是不可靠的)。

【讨论】:

    【解决方案4】:

    FileChannel.lock() 做你想做的事,只要它不是 JVM 中的另一个线程在你使用时删除目录。这需要代表 JVM 进程对文件/文件夹进行操作系统锁定,因此,虽然其他进程将无法访问该目录,但 JVM 中的线程可以。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2010-11-12
      • 2023-03-14
      相关资源
      最近更新 更多