如何仅在java中打开现有文件[重复]

Posted

技术标签:

【中文标题】如何仅在java中打开现有文件[重复]【英文标题】:How to only open an existing file in java [duplicate] 【发布时间】:2015-10-25 02:34:20 【问题描述】:

我想知道如何在java中打开一个文件进行写入,但我只想在它已经存在的情况下打开它。那可能吗?到目前为止,我已经四处搜索,发现了两个都不符合我的需求的建议。一个是打开一个文件进行附加。问题在于,如果文件不存在,它将创建它。第二个是首先使用 file.exists() 。这当然不是一个有效的解决方案,因为当我调用 file.exists() 时文件可能存在,但在我打开文件时不存在。我想要类似于 Windows API OpenFile() 的东西,我可以在其中传递 OPEN_EXISTING 标志,以便在文件不存在时调用将失败。 java中是否存在类似的东西?

仅编辑问题,因为它被标记为重复。不知道为什么。我认为我对其他答案以及为什么它们不够用非常具体。

所以我重申一下,我想打开一个文件来写。如果文件不存在,我希望打开失败。

【问题讨论】:

***.com/questions/9894959/… 文件 f = new File(filePathString); if(f.exists() && !f.​​isDirectory()) /* 做某事 */ @SumitTrehan 感谢您复制粘贴我的答案 :) 不是复制粘贴..这是一个非常常见的代码。我没有看你的答案。 @ejp,你没有准备好我的问题吗?我在那里特别声明其他帖子没有回答我的问题。使用 file.exists() 是不够的。 【参考方案1】:

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

File f = new File(filePathString);

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

或使用:

File f = new File(filePathString);

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

【讨论】:

但我想打开文件进行写入。我想我可以检查是否存在,如果存在则打开它进行写入,但问题是文件可以在这两个检查之间被删除。【参考方案2】:

只要抓住被抛出的FileNotFoundException

try (FileInputStream fis = new FileInputStream(file))

    // ...

catch (FileNotFoundException exc)

    // it didn't exist.

涉及File.exists() 和朋友的解决方案容易受到时间窗口问题的影响,因此不推荐。他们也只是复制了操作系统已经要做的事情,但是在错误的时间,所以他们是在浪费时间和空间。无论如何,你必须处理IOExceptions,所以这样做。

【讨论】:

一个很好的建议,但作为一个旁注,在空间方面这不是更浪费你创建一个不需要的 FileDescriptor 对象,以及为流本身占用系统资源吗? 但是我想打开文件进行写入,难道我不想要一个文件输出流吗? 如果您建议在我知道文件存在后打开文件进行写入,那么它可能会在这两个操作之间被删除。我不希望有任何竞争条件的机会。【参考方案3】:

不,在 Java 中没有类似的东西......核心库

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

例如

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

【讨论】:

我正在寻找一个没有失败机会的解决方案。如果我检查时它存在,当我打开写作时它可能不存在。

以上是关于如何仅在java中打开现有文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Java中现有数据之间的文本文件中添加数据[重复]

Eclipse中的重复.java文件

如何在java中将字符串保存在文件中[重复]

仅在其不为空的情况下更新 [重复]

如何默认隐藏键盘并仅在单击 EditText 时显示 [重复]

如何打开.hprof文件[重复]