1

如果具有给定名称的文件已经存在,我想创建一个用于写入的文件并获取异常。我正在寻找一个线程安全的实现,并希望在 Java 标准库中。我找到的最接近的电话是:

FileOutputStream fos = new FileOutputStream("/some/file/path.txt");

但这会截断同名的现有文件。如果已经有同名文件,是否有任何方法会引发异常或以其他方式返回错误?

4

5 回答 5

8

尝试使用 File 类和createNewFile

以下解决方案是线程安全的:

File file = new File("/some/file/path.txt");
if (file.createNewFile()) {
  // Succesfully created a new file
  FileOutputStream fos = new FileOutputStream(file);
  try {
    // Do something with outputstream
  } finally {
    try { fos.close(); } catch (IOException exception) { }
  }
}
于 2012-09-19T20:15:19.800 回答
3

这是您想要的方法:File.createNewFile

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

于 2012-09-19T20:15:04.297 回答
1

你可以

  • 检查文件是否存在
  • 如果它不写入临时
  • 将临时文件重命名为原始文件
  • 如果无法重命名临时文件,请删除它。

由于第三步在操作系统中是原子的,因此它的线程和进程是安全的。

于 2012-09-19T20:12:19.927 回答
0
File f = new File("/some/file/path.txt");
if(f.exists()) 
  {
   //delete the file
  }
   else
  {
    //create and do what you want
  }
于 2012-09-19T20:11:37.577 回答
0

是的,还有另一种方法,它也很容易与您的代码集成:

synchronized(this) {
  File f = new File("path");

  if (f.exists())
    throw new FileExistsException();
  else {
    FileOutputStream fos = new FileOutputStream(f);
    ...
  }
}
于 2012-09-19T20:12:12.423 回答