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))
...
}