是否有一种正确的方法来检查Java中是否存在文件/目录?

是否有一种正确的方法来检查Java中是否存在文件/目录?,java,file-io,Java,File Io,代码: String dir = //Path to the directory File saveDir = new File(dir); //Here comes the existence check if(!saveDir.exists()) saveDir.mkdirs(); 这部分代码用于将具有给定目录路径的文件保存到文件系统。在保存之前,我想检查给定的保存目录是否存在。然而,存在检查似乎没有按照我想要的方式工作。如果不删除if子句,就不会创建所需的目录。在搜索我的问题时,我

代码:

String dir = //Path to the  directory
File saveDir = new File(dir);
//Here comes the existence check
if(!saveDir.exists())
  saveDir.mkdirs();
这部分代码用于将具有给定目录路径的文件保存到文件系统。在保存之前,我想检查给定的保存目录是否存在。然而,存在检查似乎没有按照我想要的方式工作。如果不删除if子句,就不会创建所需的目录。在搜索我的问题时,我遇到了这个有趣的堆栈问题。 . 据我所知,java.io有这个问题

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

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).
    ... 
}

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


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

只要您在中使用时JVM中没有另一个线程正在删除目录,它就可以做您想做的事情。这需要一个代表JVM进程的文件/文件夹上的操作系统锁,因此当其他进程无法访问该目录时,JVM中的线程可以访问该目录。

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

有些不相关,但只要您小心,您可能也应该检查
isDirectory()
。谢谢您的回答。代码的其余部分使用输入和输出流启动文件保存操作,因此需要处理或抛出IOException。但是我仍然不想让我的代码尝试为现有的目录调用目录创建方法。@fga:如果目录突然出现/消失,那肯定是出了什么问题。您的代码应该行为正确,如果一切正常,就不应该抛出异常——但是当出现问题时,您必须处理异常。所以可以检查目录是否存在,因为它可以在正常的工作流中工作。但是由于这个检查不可靠,你不能说你不能说这个异常不会被抛出。还有一个答案的例子,更多的选票是有用的,而不是被接受的答案。