当前位置: 首页 > 面试题库 >

更快地获取大目录内容(java.io.File替代品)

丁恩
2023-03-14
问题内容

我已经使用了旧的过时java.io.File.listFiles()了太久了。

性能不是很好。它是:

  • 昂贵,因为它File为每个条目创建一个新对象。
  • 速度慢,因为您必须等待阵列完成才能开始处理。
  • 非常糟糕,尤其是如果您只需要处理部分内容时。

有哪些选择?


问题答案:

Java
7的java.nio.file软件包可用于增强性能。

迭代器

DirectoryStream<T>接口可用于遍历目录,而无需将其内容预加载到内存中。当旧的API在文件夹中创建一个包含所有文件名的数组时,新方法将在迭代过程中遇到每个文件名(或缓存文件名的有限大小组)时加载它。

要获取表示给定实例的实例PathFiles.newDirectoryStream(Path)可以调用static方法。我建议您使用try-with-
resources语句正确关闭流,但是如果不能关闭,请记住在末尾手动进行操作DirectoryStream<T>.close()

Path folder = Paths.get("...");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder)) {
    for (Path entry : stream) {
        // Process the entry
    }
} catch (IOException ex) {
    // An I/O problem has occurred
}

筛选器

DirectoryStream.Filter<T>界面可用于在迭代过程中跳过条目组。

由于它是a
@FunctionalInterface,从Java
8开始,您可以使用lambda表达式来实现它,从而覆盖Filter<T>.accept(T)决定应接受还是过滤给定目录条目的方法。然后,将Files.newDirectoryStream(Path, DirectoryStream.Filter<? super Path>)静态方法与新创建的实例一起使用。或者,您可能更喜欢使用Files.newDirectoryStream(Path, String)静态方法,该方法可用于简单的文件名匹配。

Path folder = Paths.get("...");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder, "*.txt")) {
    for (Path entry : stream) {
        // The entry can only be a text file
    }
} catch (IOException ex) {
    // An I/O problem has occurred
}
Path folder = Paths.get("...");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder,
        entry -> Files.isDirectory(entry))) {
    for (Path entry : stream) {
        // The entry can only be a directory
    }
} catch (IOException ex) {
    // An I/O problem has occurred
}


 类似资料:
  • 问题内容: 我正在制作一个程序,要求至少每秒捕获24个屏幕截图。目前,使用下面的代码,我每94毫秒仅获得1个,因此大约为10毫秒。 我不想使用任何第三方库,因为我试图将其保持尽可能小,但是如果我希望获得显着的性能提升,我会愿意的。我也试图保持该平台独立,但是,如果确实能够显着提高性能,我愿意将其限于Windows。 编辑:我现在也尝试了两种不同的方法;使用在oracles网站上找到的代码段,并在下

  • 问题内容: 我正在编写一个bash脚本,我想监视文件在目录中的更改(添加,删除和重命名),并相应地执行不同的操作。 有没有一种方法可以直接从我的脚本中执行此操作(除了定期创建目录和make之外)? 问题答案: 您可以使用以下命令(假设您的发行版支持inotify,大多数情况下这样做):

  • 问题内容: 我有一个3d数组,其中填充了从0到N的整数。我需要一个与该数组等于1、2、3,… N的位置对应的索引列表。我可以使用np.where进行如下操作: 但这很慢。根据这个问题 快速python numpy在哪里功能? 应该可以大大加快索引搜索的速度,但是我无法将那里提出的方法转移到我获取实际索引的问题上。加快上述代码的最佳方法是什么? 作为附加组件:我想稍后存储索引,使用np.ravel_

  • 问题内容: 我知道这个话题已经解决了上千次。但是我找不到解决办法。 我正在尝试计算列表(df2.list2)的列中出现列表(df1.list1的每一行)的频率。所有列表仅包含唯一值。List1包含约300.000行,list2包含30.000行。 我有一个有效的代码,但是它的运行速度非常慢(因为我使用的是迭代程序)。我也尝试过itertuples(),但它给了我一个错误(“要解压缩的值太多(预期2

  • 问题内容: 是否可以从中获取Path对象? 我知道您可以使用方法将路径转换为文件,但找不到相反的转换。在Java 6或更低版本中有没有办法做到这一点? 问题答案: 是的,您可以使用从对象获取它。请记住,这仅适用于Java 7+。Java 6及以下版本没有它。

  • 还有一种调用模板的情况是我们只想渲染后返回模板渲染后的数据而不是直接输出,这时我们会用fetch方法; fetch的用法和display 完全一样,只是不直接输出了; //不带任何参数 $content=$this->fetch(); 此种方式系统会自动判断模板路径,并渲染出模板内容,此种方式模板路径是:主题名/应用名/控制器名/操作名+模板文件后缀名; $content=$this->fetc