【问题标题】:How to disable file lock of a file opened by another app in a Java application如何在 Java 应用程序中禁用由另一个应用程序打开的文件的文件锁定
【发布时间】:2012-04-12 08:57:36
【问题描述】:

我正在编写一个 java 应用程序,它使用 FileInputStream 每秒读取一个文件(它在一个单独的线程中的无限循环内,然后休眠 1 秒)

文件已在另一个应用程序中打开。

当我尝试将文件保存在其他应用程序中时,我收到一条错误消息,指出该文件正在被其他程序使用。

我阅读了 FileLock API,并实现了读写时的锁定和释放:

FileOutputStream fos = new FileOutputStream(file);
FileLock fileLock = fos.getChannel().lock();
if (fileLock != null) {
    fos.write(fileContent);
    fileLock.release();
}
fos.close();

如何禁用 2 个应用程序正在访问的文件的文件锁定?

谢谢!!

编辑:我在 WINDOWS 7 上调试

【问题讨论】:

  • 为什么要禁用代码显式获取的锁?此外,如果在读取端正确释放了锁,这应该不是问题。不过,您应该使用正确的成语进行锁定(try-catch-finally)。
  • 我想禁用锁定,因为我正在监视另一个文件正在使用的外部文件。
  • 该文件是否总是被锁定?如果是,则在尝试写入之前通过调用 f.canWrite(); 检查您是否可以写入;方法?
  • 这让我很困惑...您说您从代码中读取一个文件,并展示了一个写入文件的代码示例.我假设这意味着您可以控制两个应用程序的代码。所以你真正的问题是你的阅读代码锁定了文件,但你不希望它吗?
  • 我仍然建议@nume 使用正确的习惯用法,以确保始终释放获取的文件锁。没有它,如果你只写了一次失败并出现异常并且没有达到解锁文件的代码,那么该文件将永远保持锁定状态,直到重新启动或某些实用程序解锁它。

标签: java file inputstream


【解决方案1】:

确保您始终使用正确的 try-finally 习语释放您获得的锁。这是我在生产中的代码,我们在 Windows 7 上没有问题:

OutputStream os = openFile();
try {
  if (os.getChannel().tryLock() == null) return;
  ... write to the file ...
}
finally { os.close(); } // this automatically releases the lock

【讨论】:

  • 谢谢!这就是问题
【解决方案2】:

这取决于您的操作系统。我认为 Windows 是唯一支持锁的操作系统。尝试下载Unlocker。我认为没有纯 Java 方法可以实现这一点。

【讨论】:

  • 感谢您的回答!所以你认为没有办法取消文件锁定。但是我如何避免首先创建它?如何管理我的文件 I\O,以便在另一个应用程序尝试访问它时不会锁定该文件?谢谢!!!
  • 据我所知,这在 Windows 中是不可能的。但我不得不承认我不是文件锁方面的专家 :) 也许其他人可能会提供帮助。
  • 通过调用 f.canWrite() 进行检查;尝试写之前的方法。
  • 好吧,在这种情况下,请从以下链接中找到更多信息:stackoverflow.com/questions/1500174/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多