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

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

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


当前回答

如果使用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);
    }
}

其他回答

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

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

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

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

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

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

使用以下代码段:

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

希望这能帮助到一些人。

如果使用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);
    }
}

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

下面的代码片段

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

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

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

来自Java Oracle文档