我有一个过程,将相当频繁地称为从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)

综观的JavaDoc,它说

  

未经检查的异常时试图写入到该最初未打开用于写入的信道抛出。

但我并不一定需要写入。当我尝试创建一个FileOutpuStream等,为写作目的,是幸福的,直到我试图打开同一个文件一个FileInputStream。

有帮助吗?

解决方案

(一)你知道,锁定该文件将不会保留其他进程触碰它,除非他们还使用锁?点击 (b)您有经由一个可写的信道来锁定。通过在“RW”模式RandomAccessFile获取的锁,然后打开你的FileInputStream。确保关闭两个!

其他提示

这将是更好,如果你使用tryLock(0L, Long.MAX_VALUE, true)创建的锁。

此创建一个共享锁,其是用于读做的事情。

tryLock()tryLock(0L, Long.MAX_VALUE, false)的简写,即它请求独占写锁。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top