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

如何检查Java中是否存在文件?,java,file-io,io,file-exists,Java,File Io,Io,File Exists,在打开文件以在Java中读取(相当于Perl的-e$filename)之前,如何检查文件是否存在 问题只涉及写入文件,因此使用FileWriter来回答,这在这里显然不适用 如果可能的话,我更喜欢返回true/false的真实API调用,而不是“调用API打开一个文件并捕获它抛出的异常,您可以检查文本中的“无文件”,但我可以接受后者。使用: 您可以使用以下内容:File.exists()在google上首次点击“java文件存在”: import java.io.*; public class

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

问题只涉及写入文件,因此使用
FileWriter
来回答,这在这里显然不适用

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

使用:


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

在google上首次点击“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也很有价值
这有额外的文件管理方法,通常比JDK更好。

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

new File("path/to/file.txt").isFile();
new File(“C:/”).exists()
将返回true,但不允许您将其作为文件打开和读取

f.isFile() && f.canRead()
这不会创建物理文件。将只创建类文件的对象。要实际创建文件,必须显式创建:

f.createNewFile();

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

不要。只需捕获
FileNotFoundException。
文件系统必须测试文件是否仍然存在。两次这样做没有意义,有几个理由不这样做,例如:

  • 双重密码
  • 定时窗口问题,即文件可能在测试时存在,但在打开时不存在,反之亦然,以及
  • 事实上,正如这个问题的存在所表明的那样,你可能会进行错误的测试并得到错误的答案

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

通过在JavaSE7中使用nio

import java.nio.file.*;

Path path = Paths.get(filePathString);

if (Files.exists(path)) {
  // file exist
}

if (Files.notExists(path)) {
  // file is not exist
}
如果
存在
notExists
都返回false,则无法验证文件是否存在。(可能没有访问此路径的权限)

您可以检查
path
是目录还是常规文件

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

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

请检查此项。

对于我来说,肖恩·阿奥·哈尼(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
}

实现这一点有多种方法

  • 如果只是为了生存。它可以是文件或目录

    new File("/path/to/file").exists();
    
  • 检查文件

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
    
  • 检查目录

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

  • 不要将文件构造函数与字符串一起使用。
    这可能行不通
    不使用此URI:

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

    我知道我在这方面有点晚了。然而,这里是我的答案,自Java7和更高版本以来一直有效

    下面的代码片段

    if(Files.isRegularFile(Paths.get(pathToFile))) {
        // do something
    }
    
    非常令人满意,因为如果文件不存在,方法
    isRegularFile
    将返回
    false
    。因此,无需检查
    文件是否存在(…)

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


    你可以这样做

    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);
                }
            }
        }
    
    参考和更多示例,请访问


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

  • isFile():测试此抽象路径名表示的文件是否为普通文件
  • exists():测试由此抽象路径名表示的文件或目录是否存在。

  • 无需检查f!=检查f之前为null。如果新关键字失败,它将生成异常。如果f!=无效的f+(…)使用java.io.File。toString@just实际上,它使用
    String.valueOf()
    ,该函数处理空值漂移以避免回答问题。我同意commons有很多有用的东西,但也许我们可以更进一步,为OP提出的问题提供答案。他给了我足够的答案。pearl的
    -e
    是否也能确保应用程序“可以阅读”文件?如果我想每小时检查一次文件是否已存放在某个位置,该怎么办。我有一个webMethods项目,必须检查特定文件是否已上载到特定驱动器。如何做到这一点。比方说,我想每小时检查一次,看看文件是否在那里。我可以用Java编写一个类来完成这项工作,可能需要使用某种计时器。捕获异常的代价要高得多。在我的测试中,检查新文件().exists()比捕获FileNotFoundException快10倍多。所以,若您有一个通常预期会丢失文件(如磁盘缓存)的场景,那个么异常是错误的。另外,事后再猜猜这个系统很酷。@Gnawer你还没有解决我提出的任何问题;只有当文件无法打开时才会引发异常;而且每小时发生一次的操作不需要微观优化。你的最后一句话是胡说八道。@DougHauf在你的例子中没有问题,因为在你检查存在之后你没有尝试做任何事情。但OP特别要求在开业前进行检查。在这种情况下,最好只是尝试/捕获打开的文件。还要添加您希望检查适当文件权限的内容:java.io.file有方法
    canRead
    canWrite
    ,和
    canExecute
    来检查。应该注意,这是危险的。文件系统可以随时更改,包括在“dothisfileexist”方法返回后立即更改。既然你要处理
    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);
                }
            }
        }