【发布时间】:2017-06-17 22:39:27
【问题描述】:
我正在尝试读入一个目录的所有子目录中的所有文件。我已经写好了逻辑,但是我做的有点不对,因为它在每个文件中读取了两次。
为了测试我的实现,我创建了一个目录,其中包含三个子目录,每个子目录中有 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 个,这是不正确的。当我调试的时候,文档都被插入到列表中一次,然后以完全相同的顺序再次插入。
在我的代码中,我在哪里阅读了两次文档?
【问题讨论】:
标签: java file-io java-8 java-stream