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

你可以使用以下方法:


第一次点击“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 "));
    }
}

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


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

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

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


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

File f = new File(filePathString); 

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

f.createNewFile();

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


不喜欢。只是捕捉FileNotFoundException。文件系统必须测试文件是否存在。把所有的事情都做两次是没有意义的,原因如下:

双倍代码 计时窗口问题,即文件可能在测试时存在,但在打开时不存在,反之亦然 事实上,这个问题的存在表明,你可能做了错误的测试,得到了错误的答案。

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


通过在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和notExists都返回false,则不能验证文件是否存在。(可能没有访问该路径的权限)

您可以检查path是目录还是普通文件。

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

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

请查看Java SE 7教程。


对我来说,Sean A.O. Harney的回答和Cort3z的评论似乎是最好的解决方案。

使用以下代码段:

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

希望这能帮助到一些人。


使用Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}

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

In case of just for existence. It could be file or a directory. new File("/path/to/file").exists(); Check for file File f = new File("/path/to/file"); if(f.exists() && f.isFile()) {} Check for Directory. File f = new File("/path/to/file"); if(f.exists() && f.isDirectory()) {} Java 7 way. 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


不要在String中使用File构造函数。 这可能行不通! 而不是使用URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}

我知道我在这个话题上有点晚了。然而,这是我的答案,自Java 7及更高版本起有效。

下面的代码片段

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

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

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

来自Java Oracle文档


你可以这样做

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}

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

 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


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

isFile():测试由这个抽象路径名表示的文件是否是一个正常的文件。 exists():测试由此抽象路径名表示的文件或目录是否存在。 docs.oracle.com


You must use the file class , create a file instance with the path of the file you want to check if existent . After that you must make sure that it is a file and not a directory . Afterwards you can call exist method on that file object referancing your file . Be aware that , file class in java is not representing a file . It actually represents a directory path or a file path , and the abstract path it represents does not have to exist physically on your computer . It is just a representation , that`s why , you can enter a path of a file as an argument while creating file object , and then check if that folder in that path does really exist , with the exists() method .


如果使用spring框架,文件路径以classpath开头:

public static boolean fileExists(String sFileName) {
    if (sFileName.startsWith("classpath:")) {
        String path = sFileName.substring("classpath:".length());
        ClassLoader cl = ClassUtils.getDefaultClassLoader();
        URL url = cl != null ? cl.getResource(path) : ClassLoader.getSystemResource(path);
        return (url != null);
    } else {
        Path path = Paths.get(sFileName);
        return Files.exists(path);
    }
}