我有一个将经常从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,它说



但是我不一定要写它。当我尝试创建FileOutpuStream等用于编写目的时,很高兴直到尝试在同一文件上打开FileInputStream为止。

最佳答案

(a)您是否知道,锁定文件并不能阻止其他进程使用该文件,除非它们也使用锁?
(b)您必须通过可写 channel 锁定。在“rw”模式下通过RandomAccessFile获取锁,然后打开FileInputStream。确保关闭两个!

09-05 02:50