我有一个进程,它会被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());
...
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
它说,看看JavaDocs
尝试写入最初未打开以进行写入的通道时,抛出未经检查的异常.
但我不一定要写信给它.当我尝试创建FileOutpuStream等用于写入目的时,我很高兴,直到我尝试在同一文件上打开FileInputStream.
我有一个使用POSIX顾问锁来锁定文件的C++程序.也就是说,它使用POSIX fcntl系统调用进行锁定操作.我想要一个Java程序与该C++程序进行互操作,所以我希望我的Java程序也使用POSIX顾问锁.Java中的文件锁定应该使用标准FileLock类.但是关于如何实现锁定,API文档可以理解为模糊:
此文件锁定API旨在直接映射到底层操作系统的本机锁定工具.因此,无论编写这些程序的语言如何,所有可以访问该文件的程序都可以看到文件中保存的锁.
如果我在POSIX操作系统上运行Java(Oracles,Open JDK)的通用实现,或者更具体地说是GNU/Linux系统,可以安全地假设Java FileLock类使用POSIX咨询锁吗?