我有一个进程,会从 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获取锁
RandomAccessFile
在“rw”模式下,然后打开FileInputStream
。确保关闭两者!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)