首页 > 解决方案 > Java:递归模式搜索文件(具有相对路径)以作为变量传递

问题描述

...认为这很简单...:/

我需要从工作目录(我可以找到这个)递归搜索匹配模式的文件,然后将每个文件作为输入传递给缓冲读取器。

到目前为止,我还不能很好地弄清楚路径、文件和字符串之间的类型匹配,以便在函数之间传递值......

Lil 背景:该程序将根据年份和州移动到不同的文件夹,以将文本文件解析为表格格式以进行数据质量检查。我的文本文件解析代码运行良好,但需要自动获取州内每个县的日志文件。

我实现了代码来查找当前工作目录:

File workingDir = new File(new File(".").getAbsolutePath());
Path workDir = Paths.get(workingDir.getCanonicalPath());

我得到了两个,因为我没有取得足够的进展来知道我真正需要哪个......

我已经(谢谢!)能够递归地从工作目录中找到所有文件:

        Files.find(Paths.get(workDir.toString()),
        Integer.MAX_VALUE,
        (filePath, fileAttr) -> fileAttr.isRegularFile())
        .forEach(System.out::println);

我无法弄清楚如何为我想要的文件传递过滤器;或如何将文件放入可迭代列表中,以作为缓冲读取器的输入文件列表传递。

    //List of input files for bufferedreader:
    java.util.List<String> inputFiles = new ArrayList<String>();

...然后将“Files.find(paths...”块更改为:

.forEach(inputFiles.add());

...不起作用。我不知道要为参数传递什么,并且 '...inputFiles.add()' 不会在没有参数的情况下编译(JDK 10)。

我尝试了一个 PathMatcher,但无法弄清楚如何对我传递给它的函数进行类型匹配,以便编译代码。

这是我的模式,在标准正则表达式中:

Pattern logFile = Pattern.compile("Correct_[\\d]{4}-[\\d]{2}-[\\d]{2}_[\\d]{2}-[\\d]{2}.txt");

该模式转换为:“Correct_yyyy-MM-dd_HH-MM.txt”。

我无法编译以下内容,在“.collect(Collectors.toList());”中的“收集器”上出现“.java:87: 错误:找不到符号”:

inputFiles = Files.walk(Paths.get(workDir.toString()))
                            .filter(Files::isRegularFile)
                            .map(Path::toFile)
                            .collect(Collectors.toList());

我已经导入了 java.io。,java.io.文件。, java.nio.* & java.nio.file.* 在第一行代码中。

显然,我不理解 file.io/file.nio,并且在阅读了 Oracle 文档/教程以及众多 SO 和其他论坛/站点后,我一直无法生成工作代码。

谁能指出我正确的方向?

太感谢了!

标签: javaregexfilerecursionsearch

解决方案


您报告的原始问题是java:87: error: cannot find symbol" on 'Collector' in ".collect(Collectors.toList());. 查看错误,问题已得到充分说明-您没有java.util.stream.Collectors在代码中导入。

但是一旦你导入它,你就会遇到另一个问题 - java:88: error: incompatible types: inference variable T has incompatible bounds .collect(Collectors.toList());. 这通常意味着蒸汽不会产生您需要的类型。您需要一个 inputFiles 的值,它的类型为List<String>。您得到的集合是List<File>,因为您之前在地图中使用了 Path.toFile() 。我建议您删除地图(将其保留为路径列表)或将 inputFiles 更改为List<File>.

顺便说一句,你可以在这篇文章中看到如何处理这个错误,例如:java: incompatible types: inference variable T has incompatible bounds

一般来说,最好一次调试你的代码一个编译错误,然后简单地在 SO 中查找关于你遇到的错误的帖子。这种过程可能是迭代的并且需要一些时间。


推荐阅读