- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中遇到了一个奇怪的错误。我已经通过解决方法解决了这个问题,但我仍然很好奇为什么会发生这个错误。
下面给出了一个自定义 FileVisitor 的示例,该示例正在删除它所遍历的空目录。如果目录不为空,并且它仍然遍历这些目录,则会泄漏目录描述符。如果我将 lsof 与应用程序的 PID 一起使用,它将显示一堆指向相同的几个目录的描述符,即它遍历的目录。
private String getOldestFile() {
fileVisitor.clearOldestFile();
try {
// FIXME: this was throwing FileSystemException: Too many open files after some time running. Leaking file descriptors!!
Files.walkFileTree(Paths.get(csvPath), fileVisitor);
} catch (IOException e) {
e.printStackTrace();
}
return fileVisitor.getOldestFile().toString();
}
class CustomFileVisitor extends SimpleFileVisitor<Path> {
private Path oldestFile = null;
Path getOldestFile() {
return oldestFile;
}
void clearOldestFile() {
oldestFile = null;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (attrs.isDirectory())
return FileVisitResult.CONTINUE;
if (oldestFile == null)
oldestFile = file;
if (oldestFile.compareTo(file) > 0)
oldestFile = file;
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (dir.equals(Paths.get(csvPath)))
return FileVisitResult.CONTINUE;
if (Files.list(dir).collect(Collectors.toList()).size() == 0)
Files.delete(dir); // throws an exception if folder is not empty -> mustn't delete folder with files
return FileVisitResult.CONTINUE;
}
}
CustomFileVisitor 仅在外部类中创建一次,并且定期调用该函数,如 filename = getOldestFile();
编辑:发布lsof -p {PID}
输出。一开始,我找到PID如this .
这就是 lsof -p {PID}
输出的样子,只是有数千行。 “/home/leon/Development/data/”是 Files.walkFileTree 的输入。
java 14965 leon 285r DIR 8,2 4096 1970798 /home/leon/Development/data/2017
java 14965 leon 286r DIR 8,2 4096 1970799 /home/leon/Development/data/2017/10
java 14965 leon 287r DIR 8,2 4096 1970799 /home/leon/Development/data/2017/10
java 14965 leon 288r DIR 8,2 36864 1970800 /home/leon/Development/data/2017/10/17
java 14965 leon 289r DIR 8,2 36864 1970800 /home/leon/Development/data/2017/10/17
java 14965 leon 290r DIR 8,2 4096 1970798 /home/leon/Development/data/2017
java 14965 leon 291r DIR 8,2 4096 1970798 /home/leon/Development/data/2017
java 14965 leon 292r DIR 8,2 4096 1970799 /home/leon/Development/data/2017/10
java 14965 leon 293r DIR 8,2 4096 1970799 /home/leon/Development/data/2017/10
java 14965 leon 294r DIR 8,2 36864 1970800 /home/leon/Development/data/2017/10/17
java 14965 leon 295r DIR 8,2 36864 1970800 /home/leon/Development/data/2017/10/17
编辑2:我已设法将问题隔离到这一行:Files.list(dir).collect(Collectors.toList()).size() == 0
。这不应该被垃圾收集吗?
最佳答案
来自Files#list()
documentation :
The returned stream encapsulates a
DirectoryStream
. If timely disposal of file system resources is required, the try-with-resources construct should be used to ensure that the stream's close method is invoked after the stream operations are completed.
最终,该流将被垃圾收集,但不会立即进行。所以在这种情况下你必须自己管理。
关于java - Files.walkFileTree 使用自定义 FileVisitor 泄漏目录描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46809700/
我在“旧”方式和"new"更快的 1.7 目录扫描方式之间左右为难。 我需要扫描驱动器上的所有目录并构建类似的树结构。在 1.6 中没有问题(除了慢了 10 倍),但使用 FileFisitor 时我
我需要将文件从一个目录替换到另一个目录。我在网上搜索,找到了替换文件的有效解决方案。我正在使用 Files.walkFileTree 遍历目录并替换文件。在替换文件之前,我检查目标目录中是否存在文件。
我需要对目录中最后访问的文件做一些事情。我如何知道当前对我的 visitFile() 的调用是否是最后一次调用? (我只想列出给定目录中的所有文件和目录。为此,我在我的 FileVisitor 实现中
This question is unlikely to help any future visitors; it is only relevant to a small geographic are
即使文件不存在(最近删除的文件),Java 的 java.nio.file.Files.walkFileTree() 也会执行访问者的 VisitFile() 方法。 FileUtils.forceD
我在我的应用程序中遇到了一个奇怪的错误。我已经通过解决方法解决了这个问题,但我仍然很好奇为什么会发生这个错误。 下面给出了一个自定义 FileVisitor 的示例,该示例正在删除它所遍历的空目录。如
我正在研究 Java NIO.2 及其文件操作,目前我正在研究文件树遍历函数和类。 NIO.2 FileVisitor API 很棒,很遗憾这样的东西是最近才添加到 Java SE 中的,而不是十年前
我每天都在 Scala 中学习新东西。我当前采取的路线是从 java nio 中提取功能并从中实现 Scala 实现。我观察到其他 Scala 专家如何使用 java.nio.files 包和 Fil
将 SwingWorker 与 FileVisitor 一起使用不会快速发布处理后的信息; GUI 挂起。我宁愿它没有,并且希望帮助解决这个问题。 这里简要介绍了我如何使用 SwingWorker 和
似乎长时间运行的树遍历器任务应该在类中定义,如下所示: public class TreeWalker extends SwingWorker implements FileVisitor 并从这
我是一名优秀的程序员,十分优秀!