如何在Java中仅打开现有文件

4
我想知道如何在Java中打开一个文件进行写入,但我只想在它已经存在的情况下打开它。这种可能吗?到目前为止,我已经搜索到了两个建议,但都没有满足我的需求。其中一个是打开一个文件进行追加,但问题在于如果文件不存在,它会创建一个新的文件。第二个建议是首先使用file.exists()方法。当然,这并不是一个有效的解决方案,因为当我调用file.exists()方法时,该文件可能存在,但在我打开文件时却不存在。我想要类似于Windows API OpenFile()函数的解决方案,其中我可以传递OPEN_EXISTING标志,以便在文件不存在时该调用将失败。在Java中是否存在类似的解决方案呢?
我只想编辑问题,因为它被标记为重复。 不确定为什么。 我认为我对其他答案很明确,并且说明了它们为什么不够好。
所以我要重新陈述一下:我想要打开一个文件进行写入。 如果文件不存在,我希望打开操作失败。

https://dev59.com/kmLVa4cB1Zd3GeqPsQWY - Artem Kulikov
文件 f = new File(filePathString); 如果(f.exists()&&!f.isDirectory()){ /做些什么/ } - Sumit Trehan
@SumitTrehan 谢谢你复制粘贴我的答案 :) - javawocky
不是复制粘贴..它是非常常见的代码。我没有看过你的答案。 - Sumit Trehan
@ejp,你没看到我的问题吗?我明确在那里说明其他帖子没有回答我的问题。使用file.exists()是不够的。 - user4238474
3个回答

4

如果文件路径是有效的目录,exists()函数会返回true,即使文件不存在也是如此。您可以通过使用以下方法来解决这个问题:

File f = new File(filePathString);

if(f.exists() && !f.isDirectory()) {/*Do whatever*/}

或使用:

File f = new File(filePathString);

if f.isFile() {/*Do whatever*/}

1
但我想打开文件以进行写操作。 我猜我可以检查文件是否存在,如果存在,则打开它进行写操作,但问题是在这两个检查之间该文件可能会被删除。 - user4238474

2

只需捕获抛出的FileNotFoundException异常:

try (FileInputStream fis = new FileInputStream(file))
{
    // ...
}
catch (FileNotFoundException exc)
{
    // it didn't exist.
}

File.exists()及其相关方法的解决方案容易受到时间窗口问题的影响,因此不建议使用。它们只是在错误的时间复制了操作系统已经执行的任务,因此浪费时间和空间。无论如何,您都必须处理IOExceptions


1
一个好的建议,但是顺便提一下,从空间的角度来看,这难道不更浪费吗?因为你创建了一个不需要的FileDescriptor对象,并且占用了系统资源来维护流本身。 - javawocky
1
但是我想要打开文件进行写入,那么我不是需要一个文件输出流吗? - user4238474
如果你建议在我知道文件存在后再打开它进行写入,那么在这两个操作之间它可能会被删除。我不想有任何竞争条件的机会。 - user4238474

-1

Java 中没有这样的东西... 核心库

您应该能够将逻辑包装在 if 语句中,使用 file.exists() 方法。如果您在打开文件之前进行检查,那么如果有人在其中删除了文件,您会非常不幸。检查文件是否存在的方法以及打开文件并锁定它的代码应在毫秒内运行。

例如

If (file.exists() {
  //Your Code  goes here.. 
} else {
  System.out.Print("missing file");
}

1
我正在寻找一种没有失败机会的解决方案。如果在检查时它存在,当我打开进行写入时可能不存在。 - user4238474

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接