Java 如何仅在不使用';还不存在吗?

Java 如何仅在不使用';还不存在吗?,java,file-io,Java,File Io,我正在尝试用Java实现以下操作,但不确定如何实现: /* * write data (Data is defined in my package) * to a file only if it does not exist, return success */ boolean writeData(File f, Data d) { FileOutputStream fos = null; try { fos = atomicCreateFile(

我正在尝试用Java实现以下操作,但不确定如何实现:

/*
 * write data (Data is defined in my package)
 * to a file only if it does not exist, return success
 */
boolean writeData(File f, Data d)
{
    FileOutputStream fos = null;
    try 
    {
        fos = atomicCreateFile(f);
        if (fos != null)
        {
            /* write data here */
            return true;
        }
        else
        {
            return false;
        }
    }
    finally
    {
        fos.close();  // needs to be wrapped in an exception block
    }
}
是否有一个已经存在的函数可以用于
atomicCreateFile()

编辑:哦,我不确定File.createNewFile()是否足以满足我的需要。如果我调用
f.createNewFile()
,然后在它返回到我打开文件进行写入时,其他人删除了该文件,该怎么办?有没有一种方法可以让我创建文件并打开它进行写入和锁定,一蹴而就?我需要担心吗?

只有在文件不存在的情况下才会创建文件

编辑:根据创建文件后想要锁定文件的新描述,可以使用对象锁定文件。虽然没有像您希望的那样创建和锁定一行。还有,请这样看。

当且仅当具有此名称的文件尚不存在时,以原子方式创建一个以此抽象路径名命名的新的空文件。对于可能影响文件的所有其他文件系统活动而言,检查文件是否存在和创建文件(如果不存在)是一个原子操作

编辑

杰森,至于你的担心,如果你继续阅读我们发给你的链接,你会看到一条关于这一点的说明

注意:此方法不应用于文件锁定,因为生成的协议无法可靠地工作。应改用该设施

我想你也应该读这一部分:

为什么不能使用?

Java 7版本进行测试:


啊!我怎么会错过呢?:/谢谢我的思维一直在C++中。好的,谢谢。听起来我必须仔细考虑特殊情况。(例如,如果createNewFile()成功,但打开文件通道并获取文件锁失败)因为在使用file.exists()进行测试和在不存在文件时创建文件之间,可能是其他人先创建了该文件。因为在
exists()之间
返回false,他构造
文件输出流
其他进程可以跳入并创建文件。一个经典的比赛条件。(就像我在约阿希姆前面的评论一样:-)确实是很好的证明;-)谢谢,我确实读过那张纸条,这就是引发这个呃哦。(不幸的是,这里似乎没有Java I/O范例的存储库,除了手动探索平台javadocs之外,还说这些都是可用的工具……文件和文件锁在完全不同的包中,有时使用FileChannel,有时使用FileOutputStream……有时让我头晕目眩。)我也发现了这个,但我没有将文件用作锁,我只想100%确定,如果我写入文件,我是第一个这样做的人,并且在我写入文件时没有其他人接触它。我将文件构造函数的参数更改为实际字符串,以防它失败。当系统创建文件时,它将句柄又名“锁”。当您写入文件时,它还应该获得文件对象的句柄,以便其他线程无法访问或删除它。您可以编写JUnit测试来确认这一点。如果遇到任何问题,您可以在synconized(){}中运行操作block.Read和相关注释。那么这个文件是单例文件吗?在这种情况下,我会使方法同步,这样一次只有一个线程可以访问它。
//myFile should only be created using this method to ensure thread safety
public synchronized File getMyFile(){
  File file = new File("path/to/myfile.ext");
  if(!file.exists()){
     file.getParentFile().mkdirs();
     file.createNewFile();
  }
  return file;
}  
Path out;

try {
    out = Files.createFile(Paths.get("my-file.txt"));
} catch (FileAlreadyExistsException faee) {
    out = Paths.get("my-file.txt");
}