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

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

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


当前回答

通过在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教程。

其他回答

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

我知道我在这个话题上有点晚了。然而,这是我的答案,自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
}

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

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

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

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