如何确定另一个进程是否正在使用该文件(Java)

时间:2013-04-15 08:17:04

标签: java linux file-io

我尝试了很多例子,但是没有人工作。 我尝试这个但是不行。

我还尝试使用tryLock()。它总是返回false。为什么呢?

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;
}

2 个答案:

答案 0 :(得分:2)

你捕获一个异常并返回false,这就是为什么你一直都是假的,对异常做一些事情或者没有抓住它所以你知道是否抛出异常,如果你抓到一般异常,则返回false值为false没有多大意义。

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”开头   但是给定的字符串不表示现有的可写常规字符串   文件和该名称的新常规文件无法创建,或者如果有的话   打开或创建文件时发生其他错误。

     

SecurityException -

     

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

答案 1 :(得分:0)

使用linux命令怎么样?

lsof -p 

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