用java锁定文件
如何在JVM中锁定文件,使其他非JVM进程无法获得写访问权限? 我需要读取该文件,在读取时,我希望确保其他进程不会修改该文件。 我尝试创建用java锁定文件,java,file,inputstream,Java,File,Inputstream,如何在JVM中锁定文件,使其他非JVM进程无法获得写访问权限? 我需要读取该文件,在读取时,我希望确保其他进程不会修改该文件。 我尝试创建FileInputStream,它确实锁定了要删除的文件,但并不禁止修改文件 我还尝试了随机访问文件: RandomAccessFile raf = new RandomAccessFile(file, "rw"); InputStream is = Channels.newInputStream(raf.getChannel()); 但它也不能阻止修改 P
FileInputStream
,它确实锁定了要删除的文件,但并不禁止修改文件
我还尝试了随机访问文件:
RandomAccessFile raf = new RandomAccessFile(file, "rw");
InputStream is = Channels.newInputStream(raf.getChannel());
但它也不能阻止修改
PS:在我需要InputStream的代码中,不幸的是,这不是Java可以做到的——可能主要是因为它在不同的平台上以不同的方式得到支持,Java需要保持跨平台的兼容性 例如,根据您的问题,我假设您在Windows上,在Linux下,上述代码甚至不会阻止文件删除
有一些关于文件锁定的详细信息可以解释这个问题。您是否尝试过使用
FileLock
?用法如下所示:
FileInputStream in = new FileInputStream(file);
try {
java.nio.channels.FileLock lock = in.getChannel().lock();
try {
Reader reader = new InputStreamReader(in, charset);
//Other actions...
} finally {
lock.release();
}
} finally {
in.close();
}
该代码的可能副本不起作用。我无法获得打开阅读的流的锁。我得到了
java.nio.channels.NonWritableChannelException
@maks在重复的页面上有多个答案。@Kenster但它们都是关于锁定InputStream或RandomAccessFile的。关于使用Synchronized block的答案我没有考虑如果您的问题是如何阻止其他进程修改文件,这取决于操作系统。例如,在Unix上,文件锁是协作的。一个进程只有在它是专门为此编写的情况下才会尊重一个锁。不,它不是。见我对我的问题的评论