如何检查 Java 中是否存在文件?

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

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

如果可能的话,我宁愿使用真正的 API 调用返回 true / false,而不是使用 “调用 API 来打开文件并在引发异常时捕获并在文本中检查' 无文件 '的情况下捕获”,但是我可以接受后者。

答案

使用java.io.File

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

我建议使用isFile()而不是isFile() exists() 。大多数时候,您都希望检查路径是否不仅指向文件而且还指向文件。请记住,如果您的路径指向目录,则exists()将返回 true。

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

new File("C:/").exists()将返回 true,但不允许您以文件形式打开和读取文件。

通过在 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
}

如果两者都existsnotExists返回 false,则无法验证文件的存在。 (也许没有访问权限)

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

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

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

请检查此Java SE 7 教程

使用 Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
File f = new File(filePathString);

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

f.createNewFile();

因此,可以使用f.exists()检查此类文件是否存在。

f.isFile() && f.canRead()

有多种方法可以实现此目的。

  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

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

在 Google 上首次匹配 “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 "));
    }
}

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

  • 代码翻倍
  • 计时窗口问题,测试时文件可能存在,但打开时不存在, 反之亦然;以及
  • 正如该问题的存在所表明的那样,您可能会进行错误的测试并获得错误的答案。

不要试图对系统进行第二次猜测。它知道。并且不要试图预测未来。通常,测试任何资源是否可用的最佳方法就是尝试使用它。