gpt4 book ai didi

用于读写的 Java FileLock

转载 作者:IT老高 更新时间:2023-10-28 20:46:30 27 4
gpt4 key购买 nike

我有一个进程会被 cron 频繁调用,以读取其中包含某些与移动相关的命令的文件。我的进程需要读取和写入此数据文件 - 并保持锁定以防止其他进程在此期间接触它。用户可以执行一个完全独立的过程来(潜在的)写入/附加到这个相同的数据文件。我希望这两个进程能够正常运行,并且一次只能访问一个文件。

nio FileLock 似乎是我需要的(没有编写我自己的信号量类型文件),但我无法锁定它以供阅读。我可以锁定和写得很好,但是在阅读时尝试创建锁定时,我得到了一个 NonWritableChannelException。甚至可以锁定文件以供阅读吗?似乎 RandomAccessFile 更接近我的需要,但我不知道如何实现它。

下面是失败的代码:

FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null)
{
System.out.println("Locked File");
BufferedReader in = new BufferedReader(new InputStreamReader(fin));
System.out.println(in.readLine());
...

FileLock 行抛出异常。

java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
at java.nio.channels.FileChannel.tryLock(Unknown Source)
at Mover.run(Mover.java:74)
at java.lang.Thread.run(Unknown Source)

查看 JavaDocs,它说

Unchecked exception thrown when an attempt is made to write to a channel that was not originally opened for writing.

但我不一定需要给它写信。当我尝试为写入目的创建 FileOutpuStream 等时,我很高兴直到我尝试在同一个文件上打开 FileInputStream。

最佳答案

  1. 您是否知道锁定文件不会阻止其他进程访问它,除非它们也使用锁?
  2. 您必须通过可写 channel 锁定。在“rw”模式下通过 RandomAccessFile 获取锁,然后打开您的 FileInputStream。确保将两者都关闭!

关于用于读写的 Java FileLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2268997/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com