927

如何在打开文件以在Java中读取之前检查文件是否存在(相当于Perl 的 -e $filename)?

关于 SO的唯一类似问题涉及编写文件,因此使用FileWriter这显然不适用于此处回答。

如果可能的话,我更喜欢返回 true/false 的真正API调用,而不是一些“调用 API 来打开文件并在它引发异常时捕获,您在文本中检查‘无文件’”,但我可以忍受后者。

4

17 回答 17

1451

使用java.io.File

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}
于 2009-11-29T20:35:03.350 回答
472

我建议使用isFile()而不是exists(). 大多数时候,您不仅要检查路径是否指向文件,还要检查它是否存在。请记住,exists()如果您的路径指向一个目录,它将返回 true。

new File("path/to/file.txt").isFile();

new File("C:/").exists()将返回 true 但不允许您将其作为文件打开和读取。

于 2009-11-29T20:42:48.983 回答
191

通过在 Java SE 7 中使用 nio,

import java.nio.file.*;

Path path = Paths.get(filePathString);

if (Files.exists(path)) {
  // file exist
}

if (Files.notExists(path)) {
  // file is not exist
}

如果两者都exists返回notExistsfalse,则无法验证文件是否存在。(可能没有访问此路径的权限)

您可以检查path是目录还是常规文件。

if (Files.isDirectory(path)) {
  // path is directory
}

if (Files.isRegularFile(path)) {
  // path is regular file
}

请查看此Java SE 7 教程

于 2013-08-22T03:04:55.680 回答
51

使用 Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
于 2016-06-01T13:33:32.577 回答
29
File f = new File(filePathString); 

这不会创建物理文件。只会创建类 File 的对象。要物理创建文件,您必须显式创建它:

f.createNewFile();

所以f.exists()可以用来检查这样的文件是否存在。

于 2013-05-28T10:46:42.047 回答
28
f.isFile() && f.canRead()
于 2009-11-30T15:03:09.373 回答
20

有多种方法可以实现这一目标。

  1. 如果只是为了存在。它可以是文件或目录。

    new File("/path/to/file").exists();
    
  2. 检查文件

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
    
  3. 检查目录。

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isDirectory()) {}
    
  4. Java 7 方式。

    Path path = Paths.get("/path/to/file");
    Files.exists(path)  // Existence 
    Files.isDirectory(path)  // is Directory
    Files.isRegularFile(path)  // Regular file 
    Files.isSymbolicLink(path)  // Symbolic Link
    
于 2016-08-31T18:07:03.970 回答
15

您可以使用以下内容:File.exists()

于 2009-11-29T20:35:51.740 回答
15

在谷歌上首次点击“java文件存在”:

import java.io.*;

public class FileTest {
    public static void main(String args[]) {
        File f = new File(args[0]);
        System.out.println(f + (f.exists()? " is found " : " is missing "));
    }
}
于 2009-11-29T20:36:55.703 回答
15

不。只需捕获FileNotFoundException.文件系统必须测试文件是否存在。这样做两次是没有意义的,并且有几个原因不这样做,例如:

  • 加倍代码
  • 时间窗口问题,即文件可能在您测试时存在但在您打开时不存在,反之亦然,以及
  • 事实上,正如这个问题的存在所表明的那样,您可能会进行错误的测试并得到错误的答案。

不要试图猜测系统。它知道。不要试图预测未来。一般来说,测试任何资源是否可用的最佳方法就是尝试使用它。

于 2013-07-17T21:58:28.337 回答
9

对我来说,将 Sean AO Harney 接受的答案和 Cort3z 的评论结合起来似乎是最好的解决方案。

使用了以下代码段:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}

希望这可以帮助某人。

于 2015-01-21T11:02:14.063 回答
6

我知道我在这个线程中有点晚了。但是,这是我的答案,自 Java 7 及更高版本起有效。

以下片段

if(Files.isRegularFile(Paths.get(pathToFile))) {
    // do something
}

完全令人满意,因为如果文件不存在,方法isRegularFile将返回。false因此,无需检查是否Files.exists(...).

请注意,其他参数是指示应如何处理链接的选项。默认情况下,遵循符号链接。

来自 Java Oracle 文档

于 2017-09-19T09:39:21.133 回答
4

熟悉 Commons FileUtils 也很值得https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html 这有额外的文件管理方法和通常比JDK好。

于 2009-11-29T20:39:27.270 回答
2

具有良好编码实践并涵盖所有情况的简单示例:

 private static void fetchIndexSafely(String url) throws FileAlreadyExistsException {
        File f = new File(Constants.RFC_INDEX_LOCAL_NAME);
        if (f.exists()) {
            throw new FileAlreadyExistsException(f.getAbsolutePath());
        } else {
            try {
                URL u = new URL(url);
                FileUtils.copyURLToFile(u, f);
            } catch (MalformedURLException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

参考资料和更多示例

https://zgrepcode.com/examples/java/java/nio/file/filealreadyexistsexception-implementations

于 2019-03-04T09:16:26.843 回答
1

不要将 File 构造函数与 String 一起使用。
这可能行不通!
而不是这个使用URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}
于 2016-12-01T08:21:43.540 回答
0

你可以这样做

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}
于 2018-10-17T13:18:29.373 回答
0

设计这些方法有特定的目的。我们不能说使用任何人来检查文件是否存在。

  1. isFile():测试此抽象路径名表示的文件是否为普通文件。
  2. exists():测试此抽象路径名表示 的文件或目录是否存在。docs.oracle.com
于 2019-05-03T12:18:57.680 回答