7

我尝试了很多例子,但没有一个有效。我试试这个,但不工作。

我也尝试使用tryLock(). 它总是返回假。为什么?

private boolean checkCompleteFile(File f)
{           
    RandomAccessFile file = null;
    FileLock fileLock = null;

    try
    {
        file = new RandomAccessFile(f, "rw");
        FileChannel fileChannel = file.getChannel();

        fileLock = fileChannel.lock();
        if (fileLock != null)
        {
            fileLock.release();
            file.close();
            return false;
        }

    }
    catch(Exception e)
    {
         return false;
    }

    return true;
}
4

3 回答 3

3

你捕捉到一个异常并返回假,这就是为什么你总是得到假,对异常做一些事情或不捕捉它,这样你就知道是否抛出了异常,如果你捕捉到一个一般的异常,一个假的返回值并没有真正的意义.

try {
  lock = channel.tryLock();
  // ...
} catch (OverlappingFileLockException e) {
  // File is already locked in this thread or virtual machine
}
lock.release();
channel.close();

您只需尝试访问文件并在失败时捕获异常:

boolean isLocked=false;
RandomAccessFile fos=null;
try {
      File file = new File(filename);
      if(file.exists())
        fos=new RandomAccessFile(file,"rw");        
}catch (FileNotFoundException e) {
    isLocked = true;
}catch (SecurityException e) {
    isLocked = true;
}catch (Exception e) {
    // handle exception
}finally {
    try {
        if(fos!=null) {
            fos.close();
        }
    }catch(Exception e) {
        //handle exception
    }
}

请注意,RandomAccessFile类抛出:

FileNotFoundException -

如果模式为“r”但给定的字符串不表示现有的常规文件,或者如果模式以“rw”开头但给定的字符串不表示现有的可写常规文件并且该名称的新常规文件不能被创建,或者在打开或创建文件时出现其他错误。

安全异常-

如果安全管理器存在且其 checkRead 方法拒绝对文件的读访问或模式为“rw”且安全管理器的 checkWrite 方法拒绝对文件的写访问

于 2013-04-15T08:20:45.120 回答
3

尝试使用这个:

try {
    @SuppressWarnings("resource")
    FileChannel channel = new RandomAccessFile(fileToRead, "rw").getChannel();
    //This method blocks until it can retrieve the lock. 
    FileLock lock = channel.lock(); // Try acquiring the lock without blocking. 
    try { 
        lock = channel.tryLock();
    } catch (OverlappingFileLockException e){

    }
    lock.release(); //close the file.
    channel.close();
} catch (Exception e) {             

}
于 2015-04-22T08:42:57.077 回答
1

使用linux命令怎么样?

lsof -p 

该命令将显示文件打开状态,您可以对其进行解析以检查谁使用它。

于 2013-04-15T08:30:41.460 回答