检查文件是否在Java中被锁定

我的Java程序想要读取一个文件,该文件可以被写入其中的另一个程序锁定。 我需要检查文件是否被锁定,如果是,请等待它是免费的。 我该如何实现这一目标?

Java程序在Windows 2000服务器上运行。

在使用Sun的JVM的Windows下,FileLocks应该可以正常工作,尽管JavaDocs的可靠性相当模糊(取决于系统)。

然而,如果你只需要在Java程序中识别出某个其他程序正在锁定文件,那么你就不必费力地使用FileLocks,而只是尝试写入文件,如果它被锁定则会失败。 您最好在实际系统上尝试这个,但我看到以下行为:

File f = new File("some-locked-file.txt"); System.out.println(f.canWrite()); // -> true new FileOutputStream(f); // -> throws a FileNotFoundException 

这是相当奇怪的,但是如果你没有将平台独立性计算得太高而你的系统显示相同的行为,你可以将它们放在一个效用函数中。

对于当前的Java版本,遗憾的是无法获知有关文件状态更改的信息,因此如果您需要等到文件可以写入,则必须立即尝试检查其他进程是否已释放其锁定。 我不确定,但是使用Java 7,可能会使用新的WatchService来了解这些更改。

应该在Windows中工作:

 File file = new File("file.txt"); boolean fileIsNotLocked = file.renameTo(file); 

在使用该文件的所有Java应用程序中使用FileLock ,并使它们在同一JVM中运行。 否则,这不能可靠地完成。

如果多个进程(可能是Java和非Java的混合)可能正在使用该文件,请使用FileLock 。 成功使用文件锁的关键是要记住它们只是“建议性的”。 如果您检查锁定,则保证锁定可见,但如果您忘记,它将不会阻止您对文件执行操作。 访问该文件的所有进程都应设计为使用锁定协议。

您可以尝试获取该文件的独占锁定。 只要无法获得独占锁,另一个程序就会对文件进行锁定(独占或共享)。

最好的方法是使用FileLock,但在我的情况下(jdk 1.6)我尝试了成功:

 public static boolean isFileUnlocked(File file) { try { FileInputStream in = new FileInputStream(file); if (in!=null) in.close(); return true; } catch (FileNotFoundException e) { return false; } catch (Exception e) { e.printStackTrace(); } return true; } 

仅在Windows上测试:您可以检查文件是否被锁定为以下增强的venergiac答案:检查(file.exist())文件是否存在但是FileNotFoundException意味着被锁定! 你会注意到这条消息(进程无法访问该文件,因为它正由另一个进程使用)

  public static boolean isFilelocked(File file) { try { FileInputStream in = new FileInputStream(file); in.close(); return false; } catch (FileNotFoundException e) { if(file.exist()){ return true; } return false; } catch (Exception e) { e.printStackTrace(); } return false; } 

改进了Amjad Abdul-Ghani的回答,我发现在尝试从文件中读取之前没有产生任何错误

 public static boolean isFilelocked(File file) { try { try (FileInputStream in = new FileInputStream(file)) { in.read(); return false; } } catch (FileNotFoundException e) { return file.exists(); } catch (IOException ioe) { return true; } }