Java:是否可以打开一个文件进行写入,但如果该文件已经存在,则可以将其放大?
我想创建一个用于写入的文件,如果具有给定名称的文件已经存在,则会得到一个异常。我正在寻找一个线程安全的实现,希望是在Java标准库中。我找到的最接近的电话是:Java:是否可以打开一个文件进行写入,但如果该文件已经存在,则可以将其放大?,java,file-io,Java,File Io,我想创建一个用于写入的文件,如果具有给定名称的文件已经存在,则会得到一个异常。我正在寻找一个线程安全的实现,希望是在Java标准库中。我找到的最接近的电话是: FileOutputStream fos = new FileOutputStream("/some/file/path.txt"); 但这将截断具有相同名称的现有文件。如果已经存在同名文件,是否有任何方法会引发异常或以其他方式返回错误?是的,还有另一种方法,它也可以轻松地与代码集成: File f = new File("/some/
FileOutputStream fos = new FileOutputStream("/some/file/path.txt");
但这将截断具有相同名称的现有文件。如果已经存在同名文件,是否有任何方法会引发异常或以其他方式返回错误?是的,还有另一种方法,它也可以轻松地与代码集成:
File f = new File("/some/file/path.txt");
if(f.exists())
{
//delete the file
}
else
{
//create and do what you want
}
synchronized(this) {
File f = new File("path");
if (f.exists())
throw new FileExistsException();
else {
FileOutputStream fos = new FileOutputStream(f);
...
}
}
是的,还有另一种方法,它还可以轻松地与您的代码集成:
synchronized(this) {
File f = new File("path");
if (f.exists())
throw new FileExistsException();
else {
FileOutputStream fos = new FileOutputStream(f);
...
}
}
你可以
- 检查文件是否存在
- 如果它没有写入临时
- 将临时文件重命名为原始文件
- 如果无法重命名临时文件,请将其删除
- 检查文件是否存在
- 如果它没有写入临时
- 将临时文件重命名为原始文件
- 如果无法重命名临时文件,请将其删除
由于第三步是操作系统中的原子步骤,因此其线程和进程是安全的。这是您想要的方法: 当且仅当具有此名称的文件尚不存在时,以原子方式创建一个以此抽象路径名命名的新空文件。对于可能影响文件的所有其他文件系统活动而言,检查文件是否存在和创建文件(如果不存在)是一个原子操作
这是您想要的方法: 当且仅当具有此名称的文件尚不存在时,以原子方式创建一个以此抽象路径名命名的新空文件。对于可能影响文件的所有其他文件系统活动而言,检查文件是否存在和创建文件(如果不存在)是一个原子操作 尝试使用文件类和 以下解决方案是线程安全的:
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) { }
}
}
尝试使用文件类和
以下解决方案是线程安全的:
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) { }
}
}
哦,我没有读到关于线程安全的内容,让我们将所有内容都包含在一个同步块中,您就完成了。或者,您可以使用互斥锁或锁,但这是一个与并发性相关的问题,而不是与文件存在性相关的问题。如果不跨平台使用外部锁(可以是锁文件或任何东西),您无法确定两个进程。哦,没有读到关于线程安全的内容,让我们将所有内容都包含在一个同步块中,就完成了。或者您可以使用互斥锁或锁,但这是一个与并发性相关的问题,而不是与文件存在相关的问题。如果不以跨平台方式使用外部锁(可以是锁文件或任何东西),您无法确定两个进程。我想这已经足够接近了,但是Peter指出了一个遗留的问题。您能说明这比只检查
file.exists()
更好吗?这似乎更直接地触及了核心问题——“文件已经存在了吗?”。这两种方法都不是真正的事务性方法(我不能保证只有一个线程/进程可以在同一个文件上打开FileOutputStream),这正是我猜想我们在这里最理想的方法。好的,我的问题的答案在Javadoc中:“createNewFile
自动创建一个新的空文件。。。当且仅当具有此名称的文件尚不存在时。对于可能影响文件的所有其他文件系统活动而言,检查文件是否存在和创建文件(如果不存在)是一个原子操作。“我认为这已经足够接近了,但Peter指出了一个剩余的问题。您能否澄清这如何比只检查file.exists()更好
?这似乎更直接地抓住了核心问题——“文件已经存在了吗?”。这两种方法都不是真正的事务性方法(我不能保证只有一个线程/进程可以在同一个文件上打开FileOutputStream),这正是我猜想我们在这里理想的需要。好的,我的问题的答案在Javadoc中:createNewFile
以原子方式创建一个新的空文件。。。当且仅当具有此名称的文件尚不存在时。检查文件是否存在以及如果文件不存在则创建该文件是一个单一操作,对于可能影响该文件的所有其他文件系统活动而言,该操作是原子操作。”