问:

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

唯一的 similar question on SO 处理写入文件,因此使用 FileWriter 回答,这显然不适用于此处。

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

答1:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

使用 java.io.File:

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

在某些情况下,exists() 会返回不正确的结果。例如,当使用 NFS 文件系统时,会出现文件句柄过时的问题:bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 这有点晦涩难懂,但之前在生产代码中一直是一些令人沮丧的错误的原因。

请改用 if(f.isFile())。

记得使用 filePathString.trim() 来避免空格

为了澄清 @Leon 的响应,如果 f 是一个目录或者它不存在,则 f.isFile() 返回 false。因此,它(大部分)等价于 f.exists() && !f.isDirectory(),尽管后者更明确地表达了意图。

答2:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

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

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

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

@ylun.ca 示例包含子目录?如果您要问,如果当前目录为 /path,如果正确的完整路径是 /path/to/file.txt,new File("file.txt").exists() 是否会返回 true,答案是否定的(除非存在另一个文件 /path/file.txt)。

答3:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

与 new File(path).exists() 相比有什么优势?对于 palin 存在检查

@RaghuKNair java.nio.file.Files.exists() 比 java.io.File.exists() 快很多(来自我在我测试的唯一计算机上的小基准测试:运行 Java 1.7.0_45 x64 的 Windows Server 2012)。

我自己试了一下,java.nio.file.Files.exists() 比 java.io.File.existsSLOWER 5 倍。 (Win7 Java 1.7.0_79 - x86)

这也有一个缺点,如果字符串无效,Paths.get 会抛出异常

答4:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

使用 Java 8:

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

Files.exists() 有两个参数。通常,您需要类似 Files.exists(path, LinkOption.NOFOLLOW_LINKS ) 的内容。

@MikeC我想知道没有第二个参数会调用哪个方法。 Docu 甚至没有显示任何相关信息。

@PowerFlower:只有一个 Files.exists() 方法。不传递第二个参数,它仍然调用相同的方法。第二个参数是 varargs 变量,可以传递 0 个或多个 LinkOptions。

与之前的答案重复。

答5:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

File f = new File(filePathString);

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

f.createNewFile();

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

答6:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

Pearl 的 -e 是否也确保应用程序“可以读取”文件?

答7:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

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

new File(“/path/to/file”).exists();检查文件 File f = new File(“/path/to/file”); if(f.exists() && f.isFile()) {} 检查目录。文件 f = new File(“/path/to/file”); if(f.exists() && f.isDirectory()) {} Java 7 方式。路径 path = Paths.get(“/path/to/file”); Files.exists(path) // 存在 Files.isDirectory(path) // 是目录 Files.isRegularFile(path) // 常规文件 Files.isSymbolicLink(path) // 符号链接

答8:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

不。只需捕捉 FileNotFoundException. 文件系统必须测试文件是否存在。这样做两次是没有意义的,并且有几个原因不这样做,例如:

加倍代码

时间窗口问题,即文件可能在您测试时存在但在您打开时不存在,反之亦然,以及

事实上,正如这个问题的存在所表明的那样,您可能会进行错误的测试并得到错误的答案。

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

如果我想每小时检查一次以查看文件是否已直接存放在某个位置怎么办。我有一个 webMethods 项目,它必须检查特定文件是否已上传到特定驱动器。这将如何完成。假设我想每小时检查一次以查看文件是否存在。我可以使用 Java 编写一个类,它可能使用某种计时器来执行此操作。

捕获异常的成本要高得多。在我的测试中,检查 new File().exists() 比捕获 FileNotFoundException 快 10 倍以上。因此,如果您遇到通常预期会丢失文件的情况(例如磁盘缓存),则异常是错误的。此外,事后猜测系统很酷。

@Gnawer 你还没有解决我提出的任何问题;仅当文件无法打开时才抛出异常;每小时发生一次的操作不需要微优化。你的最后一句话是胡说八道。

@DougHauf 在您的情况下没有问题,因为您在检查存在后不尝试做任何事情。但是OP专门要求在打开前检查。在这种情况下,最好尝试/捕获打开的文件。

答9:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

答10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

在谷歌上首次点击“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 "));
    }
}

在检查 f.exists 之前无需检查是否 f != null,如果新关键字失败,它将生成异常。

没有检查是否 f != null。 f + (...) 使用 java.io.File.toString

@just 实际上,它使用 String.valueOf(),它处理空值

答11:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

对我来说,将 Sean AO Harney 接受的答案和 Cort3z 的评论结合起来似乎是最好的解决方案。

使用了以下代码段:

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

希望这可以帮助某人。

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com