代码之家  ›  专栏  ›  技术社区  ›  Pyrolistical

如何安全地更新具有多个读卡器和一个写入器的文件?

  •  3
  • Pyrolistical  · 技术社区  · 16 年前

    1. 如果写入失败,则前一个文件仍然可读
    2. 读者支撑不住一位作家

    我正在使用Java,我目前的解决方案是让编写器写入一个临时文件,然后使用 File.renameTo() . 问题出在NTFS上, renameTo 如果目标文件已经存在,则失败,因此您必须自己删除它。但是如果写入程序删除目标文件,然后失败(计算机崩溃),我就没有一个可读的文件。

    如何使用Java安全地更新具有多个读卡器的文件?

    6 回复  |  直到 16 年前
        1
  •  3
  •   sblundy    16 年前

    根据 JavaDoc

    直接映射到本机锁定 系统因此,文件上的锁 应该对所有 有权访问该文件,无论 这些程序使用的语言

        2
  •  1
  •   casperOne    16 年前

    我不知道这是否适用,但如果您在纯Vista/Windows Server 2008解决方案中运行,我会使用TxF(事务性NTFS),然后确保您通过JNI调用适当的文件API来打开文件句柄并执行文件操作。

    如果这不是一个选项,那么我认为您需要一种所有客户端都可以访问的服务,它负责协调文件的读/写。

        3
  •  1
  •   Paul Tomblin    16 年前

    在Unix系统上,我会删除该文件,然后打开它进行写入。任何打开它阅读的人都会看到旧的,一旦他们都关闭了它,它就会从文件系统中消失。我不知道NTFS是否有类似的语义,尽管我听说它完全基于BSD的文件系统,所以可能是这样。

        4
  •  1
  •   Hades32    16 年前

    无论是什么操作系统等,应该始终有效的东西正在改变您的客户端软件。

    如果这是一个选项,那么您可以拥有一个文件“settings1.ini”,如果您想更改它,您可以创建一个文件“settings2.ini.wait”,然后将您的内容写入其中,然后将其重命名为“settings2.ini”,然后删除“settings1.ini”。

    如果上次读取了settings1.ini,则更改后的客户端软件将始终检查settings2.ini,反之亦然。

        5
  •  0
  •   Thomas Tempelmann    16 年前

    可能不需要锁定。我不太熟悉Windows上的FS API,但由于NTFS同时支持硬链接和软链接,因此,如果您的设置允许,您可以尝试以下方法:

    使用硬链接或软链接指向实际文件,并对文件进行不同的命名。允许每个人使用链接的名称访问该文件。

    在同一文件夹中以其他名称写入新文件。

    然而,我不知道如何在Java中创建链接。也许你必须使用一些本地API来实现这一点。

    我希望这能有所帮助。

        6
  •  -1
  •   Adam Paynter    16 年前

    我最近一直在处理类似的事情。如果运行java 5,也许您可以考虑使用NIO文件锁与ReNeReTrAdRead?确保所有引用FileChannel对象的代码也引用ReentrantReadWriteLock。这样,NIO将它锁定在每VM级别,而可重入锁将它锁定在每线程级别。

    FileLock fileLock = filechannel.lock(position, size, shared);
    reentrantReadWriteLock.lock();
    
    // do stuff
    
    fileLock.release();
    reentrantReadWriteLock.unlock();
    

    当然,需要进行一些异常处理。

    推荐文章