Java 防止与文件的争用条件

Java 防止与文件的争用条件,java,file,race-condition,file-descriptor,Java,File,Race Condition,File Descriptor,如果我用java.io.file#canRead()测试我是否对某个文件拥有权限,然后创建一个FileOutputStream,那么(据我所知)可能会有另一个进程(例如chmod或mv)修改权限或重命名该文件,删除它或将其切换到另一个文件 例如,我只想在文件可执行的情况下将某些内容写入文件 在C语言中,可以使用FileDescriptor防止类似的竞争条件 在Java中,有一个Java.io.FileDescriptor类,但这个类似乎只用于同步缓冲区和创建流,我需要一个File*Stream来

如果我用
java.io.file#canRead()
测试我是否对某个文件拥有权限,然后创建一个
FileOutputStream
,那么(据我所知)可能会有另一个进程(例如
chmod
mv
)修改权限或重命名该文件,删除它或将其切换到另一个文件

例如,我只想在文件可执行的情况下将某些内容写入文件

在C语言中,可以使用
FileDescriptor
防止类似的竞争条件

在Java中,有一个
Java.io.FileDescriptor
类,但这个类似乎只用于同步缓冲区和创建流,我需要一个
File*Stream
来获取
FileDescriptor

如何防止这种竞争条件,例如使用
FileDescriptor
或其他机制


或者,
文件
是否以某种方式防止了这种情况?

您可以更改方法,并从包
Java.NIO.channels
中使用Java NIO API的
文件锁
类。根据:

此文件锁定API旨在直接映射到底层操作系统的本机锁定功能。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的

要检查权限,可以再次使用NIOAPI。例如:

import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public static void main(String[] args) {

    String filePath = args[0];  
    Path p = Paths.get(filePath);

    if (Files.notExists(p))
        throw new FileNotFoundException();

    if (Files.isWritable(p))
        ...

    if (Files.isReadable(p))
        ...

    if (Files.isExecutable(p))
        ...

}

raFile
是一个成员变量,而不是一个方法。
fc=raFile()
如何工作?如何检查权限?@dan1st我修复了打字错误,并提供了有关文件权限的其他信息。然而,一些人认为手动检查权限是一种不好的做法,他们更喜欢尝试对文件执行操作并捕获异常。根据官方文档,此接口的
路径
从竞争条件中保存?@dan1st实现是不可变的,可供多个并发线程安全使用。
import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public static void main(String[] args) {

    String filePath = args[0];  
    Path p = Paths.get(filePath);

    if (Files.notExists(p))
        throw new FileNotFoundException();

    if (Files.isWritable(p))
        ...

    if (Files.isReadable(p))
        ...

    if (Files.isExecutable(p))
        ...

}