Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java锁定文件_Java_File_Inputstream - Fatal编程技术网

用java锁定文件

用java锁定文件,java,file,inputstream,Java,File,Inputstream,如何在JVM中锁定文件,使其他非JVM进程无法获得写访问权限? 我需要读取该文件,在读取时,我希望确保其他进程不会修改该文件。 我尝试创建FileInputStream,它确实锁定了要删除的文件,但并不禁止修改文件 我还尝试了随机访问文件: RandomAccessFile raf = new RandomAccessFile(file, "rw"); InputStream is = Channels.newInputStream(raf.getChannel()); 但它也不能阻止修改 P

如何在JVM中锁定文件,使其他非JVM进程无法获得写访问权限? 我需要读取该文件,在读取时,我希望确保其他进程不会修改该文件。 我尝试创建
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上,文件锁是协作的。一个进程只有在它是专门为此编写的情况下才会尊重一个锁。不,它不是。见我对我的问题的评论