当前位置: 首页 > 面试题库 >

如何使用Java锁定文件(如果可能)

秦宏盛
2023-03-14
问题内容

我有一个使用FileReader打开文件的Java进程。如何防止另一个(Java)进程打开该文件,或者至少通知第二个进程该文件已打开?如果文件已打开(这解决了我的问题),这是否使第二个进程自动获得异常?还是我必须在第一个进程中使用某种标记或参数来显式打开该文件?

澄清:
我有一个Java应用程序,其中列出了一个文件夹并打开列表中的每个文件进行处理。依次处理每个文件。每个文件的处理包括读取文件并根据内容进行一些计算,大约需要2分钟。我也有另一个Java应用程序,它执行相同的操作,但写在文件上。我想要的是能够同时运行这些应用程序,这样情况就可以这样。ReadApp列出文件夹并找到文件A,B,C。它将打开文件A并开始读取。WriteApp列出该文件夹并查找文件A,B,C。它将打开文件A,看到已打开(通过异常或其他方式),然后转到文件B。ReadApp完成了文件A并继续到B。打开并继续到C。WriteApp不能 在ReadApp读取同一文件时进行写入,反之亦然。它们是不同的过程。


问题答案:

FileChannel.lock可能就是你想要的。

try (
    FileInputStream in = new FileInputStream(file);
    java.nio.channels.FileLock lock = in.getChannel().lock();
    Reader reader = new InputStreamReader(in, charset)
) {
    ...
}


 类似资料:
  • 问题内容: UNIX文件锁定非常简单:操作系统假定您知道自己在做什么,然后就可以按照自己的意愿进行操作: 例如,如果您尝试删除另一个进程已打开的文件,则操作系统通常会允许您执行此操作。原始进程仍将保留其文件句柄,直到它终止-这时文件系统将安静地回收磁盘资源。不用大惊小怪,这就是我喜欢的方式。 Windows上的不同之处:如果我尝试删除另一个进程正在使用的文件,则会出现操作系统错误。在原始进程释放它

  • 问题内容: 我想锁定android sdcard上的文件。我需要锁定它们,因此除我的软件外,没有人可以删除复制移动或​​通过蓝牙或任何其他方式发送它们。我该怎么做? 问题答案: 我认为您想加密文件。尽管该文件仍然可以移动,但对您的应用程序而言,它将毫无用处。人们将能够复制,移动,删除,但内容不会受到损害。

  • 问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java

  • 问题内容: 我希望以下测试仅打印“已被锁定”一次。但是它因此会打印行。 据我了解,将在可能的情况下将其锁定(即,如果尚未锁定)。但是显然不是这样。 如何设置这样的锁线程安全? 问题答案: 名称为,表示您已经拥有锁了。 如果希望使用线程块,则可以使用例如具有1(或更多)许可的a。

  • 问题内容: 在Bash中,我试图使函数getLock与不同的锁名一起使用。 但是羊群说 如何仅锁定文件并在需要时释放它,而不必在集群中执行命令? 它的用法如下: 问题答案: 锁定文件: 释放锁: 您也可以按照羊群手册页中的描述进行操作: …在这种情况下,文件退出时文件会自动关闭。(在这里也可以通过使用而不是来使用子外壳,但这应该是一个有意的决定- 因为子外壳会降低性能,并且会影响范围变量的修改和其

  • 问题内容: 我有几个线程(其中一些由进程X产生,其他由进程Y 等产生 ),并且每个线程都需要写入文件。但是,如果开始写第一,那么,当开始写作,它需要等待到 释放文件 ,以便它可以读取写在该内容。换句话说,每个线程都会有一个方法,如下所示: 我的问题是:如何完成以上代码?我正在研究该类,但是它在Javadoc中说: “文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。