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

DVK*_*DVK 802 java io file-io

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

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

如果可能的话,我更喜欢真正的API调用返回true/false,而不是某些"调用API来打开文件并在它抛出异常时捕获,你在文本中检查'没有文件'",但我可以忍受后者.

Sea*_*ney 1302

使用java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,exists()将返回不正确的结果.例如,当使用NFS文件系统时,存在过时文件句柄的问题:http://bugs.java.com/bugdatabase/view_bug.do?video_id = 5003595这有点模糊,但一直是令人沮丧的原因以前生产代码中的错误. (14认同)
  • 请改用`if(f.isFile())`. (10认同)
  • 记住使用 filePathString.trim() 来避免空格 (3认同)
  • 为了澄清@Leon的响应,如果“f”是一个目录或者不存在,“f.isFile()”将返回“false”。因此,它(大部分)相当于“f.exists() && !f.​​isDirectory()”,尽管后者更明确地表达了意图。 (2认同)

Chr*_*ail 414

我建议使用isFile()而不是exists().大多数情况下,您要检查路径是否指向文件,而不仅仅是它存在.请记住,exists()如果路径指向目录,则返回true.

new File("path/to/file.txt").isFile();
Run Code Online (Sandbox Code Playgroud)

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


Won*_*nil 137

通过在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
}
Run Code Online (Sandbox Code Playgroud)

如果两者都存在且notExists返回false,则无法验证文件是否存在.(也许没有访问权限)

您可以检查路径是目录还是常规文件.

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

if (Files.isRegularFile(path)) {
  // path is regular file
}
Run Code Online (Sandbox Code Playgroud)

请查看此Java SE 7教程.

  • 与新File(path).exists()相比,优势是什么?对于帕林存在检查 (2认同)
  • @RaghuKNair`java.nio.file.Files.exists()`比`java.io.File.exists()`快得多*(来自我测试的唯一计算机上的小基准测试:运行Java的Windows Server 2012) 1.7.0_45 x64). (2认同)

Wen*_*del 44

使用Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
Run Code Online (Sandbox Code Playgroud)

  • @PowerFlower:只有一个 Files.exists() 方法。没有传递第二个参数,它仍然调用相同的方法。第二个参数是 varargs 变量,可以传递 0 个或多个 LinkOptions。 (4认同)
  • `Files.exists()`有两个参数。通常,您会想要类似`Files.exists(path,LinkOption.NOFOLLOW_LINKS)`之类的东西。 (2认同)

小智 26

File f = new File(filePathString); 
Run Code Online (Sandbox Code Playgroud)

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

f.createNewFile();
Run Code Online (Sandbox Code Playgroud)

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


小智 25

f.isFile() && f.canRead()
Run Code Online (Sandbox Code Playgroud)

  • 珍珠的`-e`是否也确保应用程序"可以读取"文件? (2认同)

Rag*_*air 16

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

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

    new File("/path/to/file").exists();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查文件

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

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isDirectory()) {}
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)


Fra*_* IV 14

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


jus*_*ody 14

在谷歌上首次点击"java file exists":

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 "));
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*421 11

别.只需捕获FileNotFoundException.文件系统必须测试文件是否仍然存在.完成所有这两次没有意义,有几个原因没有,例如:

  • 加倍代码
  • 定时窗口的问题,由此当您测试该文件可能存在,但不是当你打开,或者反之亦然,
  • 事实上,正如这个问题的存在所表明的那样,你可能会做出错误的测试并得到错误的答案.

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

  • 捕获异常会更加昂贵.在我的测试中,检查新的File().exists()比捕获FileNotFoundException快10倍.因此,如果您有一个通常预期会丢失文件的场景(例如磁盘缓存),则异常是错误的.而且,第二次猜测系统很酷. (2认同)
  • @DougHauf 在你的情况下没有问题,因为你在检查存在性后不会尝试做任何事情。但OP特别要求在打开前进行检查。在这种情况下,最好尝试/捕获文件打开情况。 (2认同)

小智 8

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

使用以下代码段:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人.


avi*_*rat 6

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

以下片段

if(Files.isRegularFile(Paths.get(pathToFile))) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

来自 Java Oracle 文档


pet*_*ust 5

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

  • 不回答问题的方式。我同意 commons 有很多有用的东西,但也许我们可以更进一步,并为 OP 提出的问题提供答案。 (22认同)
  • 他给了我足够的答案。 (5认同)