【问题标题】:Java File.delete() hangs or taking too longJava File.delete() 挂起或耗时过长
【发布时间】:2021-08-01 10:12:59
【问题描述】:

我只是根据过滤器删除文件

public void delete(String folder, String filter){
   File f = new File(path);
   String[] files = f.list();
   for (string s : files){
      if (s.indexOf(filter) >= 0){
          new File(folder + s).delete(); 
      }
   }
}

这通常会在几微秒内顺利进行。

但有时,我有用户报告此部分挂起。如果应用程序长时间无响应,我会杀死它并获取堆栈跟踪,这就是线程所在的位置:

在 java.io.WinNTFileSystem.delete

有时写入文件时也会发生这种情况。我想知道它是否可以被JVM锁定的文件。有什么方法可以检查吗?

【问题讨论】:

  • 这很可能是 Windows 问题。该文件可能已被锁定或类似情况。
  • 您是否要删除远程文件系统上的文件?如果是这样,任何事情都可能发生,包括什么也没有。
  • 文件在 PC 上是本地的。我认为这些文件很可能在我操作它们时被其他进程访问,甚至可能在 java 调用期间。如果一个文件正在被操作,而另一个进程在此期间将其锁定,这是预期的行为吗?
  • 不要使用delete()。尝试使用Files.delete()
  • 问题是我不仅在 File.delete() 中看到了这一点,还在写入文件中看到了这一点。我可能会尝试将所有文​​件操作转换为文件,这是个好主意。

标签: java


【解决方案1】:

操作系统中的某些东西可能打开了文件。当一个文件在他们的 IDE 或其他东西中打开并且他们试图删除一个目录时,任何人都在 Windows 中看到了这个问题。

Java NIO 有一些可能会有所帮助的特性,FileChannel、FileLock。这不是很好。

例如,你可以杀死它运行很长时间,然后检查你是否可以获得排他锁

File file = new File(fileName);
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
  // lock is exclusive, you should be able to delete if you have permissions
} else {
  // cannot get lock
}
channel.close();

【讨论】:

  • 如果文件确实被锁定,来自 java 的系统调用是否会挂起?如果是这样的话,这听起来像是令人难以置信的糟糕设计。
  • @Jake 我不确定。通过在记事本之类的文件中打开文件并尝试通过简单的测试程序将其删除,它似乎应该可以在本地重现。
  • 我做了,但没有成功。在记事本中打开它,在不保存的情况下进行一些更改。还尝试在eclipse中打开它,可悲的是无法重现它。感谢您的帮助!
  • 如果您在 Windows 上,也许您可​​以尝试导航到 .zip 或 .jar 文件。 Windows 10 将允许您浏览它,但它并没有真正被提取。通常我无法(从 Windows 资源管理器)删除我正在浏览的档案,当我查看档案内容时,我的用例就像在我的 maven 目标文件夹中一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2013-06-16
  • 2013-02-26
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多