如何使用Files.walk一次读取子目录中的所有文件?

Cache Staheli

我试图读取目录中所有子目录中的所有文件。我已经写了逻辑,但是我做错了一点,因为它在每个文件中读取了两次。

为了测试实现,我创建了一个目录,其中包含三个子目录,每个子目录中都有10个文档。总共应该有30份文件。

这是我正确阅读文档的测试代码:

String basePath = "src/test/resources/20NG";
Driver driver = new Driver();
List<Document> documents = driver.readInCorpus(basePath);
assertEquals(3 * 10, documents.size());

其中Driver#readInCorpus具有以下代码:

public List<Document> readInCorpus(String directory)
{
    try (Stream<Path> paths = Files.walk(Paths.get(directory)))
    {
        return paths
                .filter(Files::isDirectory)
                .map(this::readAllDocumentsInDirectory)
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    return Collections.emptyList();
}

private List<Document> readAllDocumentsInDirectory(Path path)
{
    try (Stream<Path> paths = Files.walk(path))
    {
        return paths
                .filter(Files::isRegularFile)
                .map(this::readInDocumentFromFile)
                .collect(Collectors.toList());
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    return Collections.emptyList();
}

private Document readInDocumentFromFile(Path path)
{
    String fileName = path.getFileName().toString();
    String outputClass = path.getParent().getFileName().toString();
    List<String> words = EmailProcessor.readEmail(path);
    return new Document(fileName, outputClass, words);
}

当我运行测试用例时,我看到assertEquals失败了,因为检索了60个文档,而不是30个,这是不正确的。当我调试时,所有文档都一次插入到列表中,然后以完全相同的顺序再次插入。

我在代码中的哪里读两次文档?

奥雷斯特

问题出在Files.walk(path)方法上。您使用不正确。因此,它像树一样遍历文件系统。例如,您有3个文件夹-/parent和2个子文件夹/parent/first/parent/secondFiles.walk("/parent")将为您Paths提供每个文件夹的-父级和2个子级,实际上这是在您的readInCorpus方法中发生的

然后,对于每种Path方法readAllDocumentsInDirectory您都在调用第二种方法和同一故事,它遍历文件夹就像一棵树。

对于readAllDocumentsInDirectory/parent路径,它将从两个孩子的文件夹中返回文档/parent/first/parent/second,然后你有2个以上的电话readAllDocumentsInDirectory/parent/first/parent/second来自这两个文件夹是文件的回报。

这就是为什么您的文档增加一倍的原因。要解决此问题,您仅应readAllDocumentsInDirectory使用带Paths.get(basePath)参数的readInCorpus方法和remove方法来调用它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何一次将所有文件添加到pubspec.yamal中资产的子目录中?

我们如何从所有子目录中读取所有 json 文件?

如何在bash中读取所有子目录并创建相应的文件?

如何永久删除1次命中子目录中的所有文件

如何遍历所有子目录中的文件?

如何报告所有子目录中的文件数?

Os.walk 使用 python 从所有子目录中提取 .gz 文件

如何使用vim打开当前目录和所有子目录中的所有文件?

如何使用Webpack将所有子目录中的JSON文件合并为一个文件?

如何更改当前目录,子目录以及子目录的子目录中的文件所有权?

如何在一个会话中记录对目录,子目录和文件的所有修改?

如何忽略一个目录及其子目录中的特定扩展名的所有文件?

如何从某个目录中删除所有文件,但该目录的子目录除外?

如何使用Grunt压缩子文件夹/子目录中的所有JavaScript文件?

如何使用通过FTP的骆驼路由将所有文件从目录(包括子目录)移动到特定目录,而目标中没有子目录?

如何删除所有子目录中具有给定名称的所有文件?

如何在bash中gzip所有子目录中的所有文件

list.files()目录和子目录中的所有文件

如何在hadoop hdfs中列出目录及其子目录中的所有文件

如何在Windows中的目录和子目录中查找所有头文件

如何使用通配符 ls 子目录中的所有文件?

如何使用python遍历Google Cloud Storage子目录中的所有文件名?

如何列出Linux中的所有可执行文件(目录,子目录,$ PATH)?

Mac:如何递归地在子目录中查找最大的文件(忽略所有目录)

如何将子目录中的所有文件递归移动到单个目录?

如何在目录/子目录下的所有文件中搜索文本

如何排除所有子目录,但在rsync中包括目录文件?

如何重命名(取消隐藏)目录中的所有文件和子目录?

如何在php中列出目录,子目录和所有文件