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

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

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

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

1360311 次浏览

使用java.io.File

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

您可以使用以下命令:File.exists()

在谷歌上首次点击“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 FileUtilshttps://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.文件系统必须测试文件是否存在。做两次是没有意义的,有几个理由不这样做,例如:

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

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

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

请检查这个JavaSE 7教程

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

使用了以下代码片段:

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

希望这能帮助到别人。

使用Java8:

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

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

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

    new File("/path/to/file").exists();
  2. Check for file

    File f = new File("/path/to/file");if(f.exists() && f.isFile()) {}
  3. Check for Directory.

    File f = new File("/path/to/file");if(f.exists() && f.isDirectory()) {}
  4. Java 7 way.

    Path path = Paths.get("/path/to/file");Files.exists(path)  // ExistenceFiles.isDirectory(path)  // is DirectoryFiles.isRegularFile(path)  // Regular fileFiles.isSymbolicLink(path)  // Symbolic Link

不要将文件构造函数与String一起使用。
这可能行不通!
而不是使用URI:

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

我知道我在这个线程中有点晚了。然而,这是我的答案,自7Java起有效。

以下片段

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

非常满意,因为如果文件不存在,方法isRegularFile返回false。因此,无需检查Files.exists(...)

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

从JavaOracle留档

你可以这样做

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

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

  1. isFile()方法名:测试此抽象路径名表示的文件是否为普通文件。
  2. 存在():测试此抽象路径名表示的文件或目录是否存在。docs.oracle.com

您必须使用file类,创建一个文件实例,其中包含要检查是否存在的文件的路径。之后,您必须确保它是一个文件而不是目录。之后,您可以在该文件对象上调用引用您的文件的存在方法。请注意,java中的file类不代表文件。它实际上代表了目录路径或文件路径,它代表的抽象路径不必在您的计算机上物理存在。它只是一个表示,这就是为什么,您可以在创建文件对象时输入文件的路径作为参数,然后检查该路径中的文件夹是否确实存在,使用的方法有()。