我试着锁定一个文件,在Windows环境与 文件锁 我有一个问题:之后我锁定文件,它仍然可以访问其他进程至少在某一水平上。

例的代码如下:

public class SimpleLockExample {
    public static void main(String[] args) throws Exception {
        String filename = "loremlipsum.txt";

        File file = new File(filename);
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        FileChannel channel = raf.getChannel();

        FileLock lock = null;
        try {
            lock = channel.tryLock();
            String firstLine = raf.readLine();
            System.out.println("First line of file : " + firstLine);
            waitForEnter();
            lock.release();
        } catch (OverlappingFileLockException e) {
            e.printStackTrace();
        }

        lock.release();
        System.out.println("Lock released");

        channel.close();
    }

    private static void waitForEnter() throws Exception {
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));
        reader.readLine();
        reader.close();
    }
}

现在,当我锁定我的文件,这个例子,它被锁定:

  • 它不能被删除,通过窗户
  • 日食拒绝打开它

...但它是不是仍然完全防弹:

  • 如果我打开赛特(一个文本编辑),例如,没有内容所示,但如果我选择保存的文件(空作为开或与某些内容写入),它成功和内容的文件清零...(没有内容存在事后即使我写的东西赛特)

是否有一些方法来防止该文件完全从被复盖/清除由其他进程与Java在窗口?

如果我理解正确的,我使用的是专锁定自动取款机。与共享锁甚至有更多的事情可以做到的。

这个测试是运行用Windows2000。

br, 的样子

有帮助吗?

解决方案

棘手的文件锁API本身不承诺:

这个文件-锁定API目的是 地图直接地锁定 设施的基本操作 系统。因此锁举行的上一个文件 应该可以看到的所有程序 访问的文件,不管 该语言在这些程序 是书面的。

是否实际上锁 防止从另一个程序 访问的内容锁定 区域系统和依赖性 因此,"未指定"。本机的 文件锁定设施的一些 系统仅仅是咨询意思 这一程序必须合作 观察一个已知的锁定的协议 为保证数据的完整性。上 其他系统机文件锁 强制性的,这意味着,如果一个程序 锁一个地区的一个文件,那么其他的 程序实际上是阻止 访问该区域的方式 将违反锁。上还有其他 系统,无论是当地的文件锁 咨询或强制性配置, 在每一个文件的基础。要确保 一致和正确的行为 平台,它强烈建议 这锁提供这API是 使用,如果他们是咨询锁。

奇怪的是,讨论有关的文件锁API时,它是根据发展权,Windows操作系统提供 强制性的 锁定和Unix只有咨询锁。以上是阅读一个可能期待你的代码的工作只是现在窗口。

我不知道发生了什么,你的编辑是没有这么多修改该文件作为创建一个临时文件,然后操纵的目录条目了replce该文件的版本你已经锁定一个新的版本。会Windows允许这样的行为?

我不知道如果你需要求助于JNI以得到的控制水平,你需要的。

其他提示

您的呼叫。tryLock()may return null如果它没有得到锁。从如果是的话,为什么不试:

锁定对象,表示了新获得的锁,或null如果锁定就不可能取得的,因为另一个节目有一个重叠的锁

此外,你代码目前打开了文件 然后 它试图获得锁。而不是你应该循环试图获得锁,并一旦你得到了它,打开文件,阅读该文件,关闭文件,然后放弃锁。和放弃锁在 finally {} 条款,只是在情况代码引发异常与锁举行。(曾经重新启动Windows的机器只是因为一些文件被锁了吗?)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top