我有一个进程,该进程将经常从 cron 调用以读取一个包含某些移动相关命令的文件。我的进程需要读取和写入此数据文件-并在此期间保持其锁定,以防止其他进程触摸它。能够由用户执行完全分离的进程来(潜在地)写入/追加到同一数据文件中。我希望这两个进程友好相处,并且每次只访问文件一次。
听起来nio FileLock就是我所需要的(除了编写自己的信号量类型文件),但我在尝试为读取创建锁定时遇到了问题。我可以很好地锁定并写入,但是尝试创建读取锁定时却收到NonWritableChannelException。是否可能为读取锁定文件?似乎RandomAccessFile更接近我需要的,但我不知道如何实现它。
以下是失败的代码:
听起来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,它说:
当尝试向最初未为写入打开的通道写入数据时抛出未经检查的异常。
但我不一定需要写入它。 当我尝试创建一个用于编写目的的FileOutputStream等文件时,它很开心,直到我尝试在同一文件上打开FileInputStream。