【问题标题】:Lock the file in java在java中锁定文件
【发布时间】:2014-12-10 10:38:10
【问题描述】:

如何将文件锁定在 JVM 中,以使其他非 JVM 进程无法获得写访问权限? 我需要阅读该文件,并且在阅读时我想确保其他进程不会修改该文件。 我尝试创建FileInputStream,它确实锁定了文件以进行删除,但它并不禁止修改文件。

我也试过RandomAccessFile

RandomAccessFile raf = new RandomAccessFile(file, "rw");
InputStream is = Channels.newInputStream(raf.getChannel());

但它也不会阻止修改。

PS:在代码中我需要 InputStream

【问题讨论】:

  • 该代码不起作用。我无法获取打开以供阅读的流的锁定。我得到java.nio.channels.NonWritableChannelException
  • @maks 重复页面上的答案不止一个。
  • @Kenster 但它们都是关于锁定 InputStream 或 RandomAccessFile。关于使用同步块的答案我不考虑
  • 如果您的问题是如何阻止其他进程修改文件,这取决于操作系统。例如,在 Unix 上,文件锁是协作的。只有专门为此编写的进程才会兑现锁。

标签: java file inputstream


【解决方案1】:

不幸的是,这不是 Java 可以做到的——可能很大程度上是因为它在不同平台上以不同的方式受到支持,而 Java 需要保持跨平台兼容性。

例如,根据您的问题,我假设您在 Windows 上,因为在 Linux 下,上述代码甚至不会阻止文件删除。

http://en.wikipedia.org/wiki/File_locking 有一些关于文件锁定的详细信息,它解释了这个问题。

【讨论】:

    【解决方案2】:

    您是否尝试过使用FileLock?用法会是这样的sn-p:

    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();
    }
    

    【讨论】:

    • 不,它没有。查看我对我的问题的评论
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多