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

Hel*_*nar 25 java locking

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

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

Vla*_*lad 33

应该在Windows中工作:

File file = new File("file.txt");
boolean fileIsNotLocked = file.renameTo(file);
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的答案。小警告:显然它实际上写入(重命名)文件。就我的目的而言,这很好,但人们应该意识到这一点。 (4认同)

jar*_*bjo 14

在使用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
Run Code Online (Sandbox Code Playgroud)

这是相当奇怪的,但如果您不将平台独立性计算得太高而系统显示相同的行为,则可以将它们放在一个实用程序函数中.

与当前的Java版本,不幸的是没有办法有关文件状态变化被告知,所以如果你需要等到文件可写,你现在想尽再检查其他进程已经发布了其锁定.我不确定,但是使用Java 7,可能会使用新的WatchService来了解这些更改.

  • 此行为对Windows不正确,因为File.canWrite()仅检查MS-DOS只读标志,而不检查文件的ACL.因此,它会为您无权写入的文件提供误报. (4认同)
  • 注意:如果它是现有文件,那么它将从文件中删除所有数据。 (2认同)
  • 使用 new FileOutputStream(file, true) 以免删除文件内容(如果文件存在)。 (2认同)

Ben*_*n S 5

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