使用 java8 流读取 1 个文件,并根据一些标准写出 3 个文件



需要明确的是 - 这里的目标是使用输入和输出流,这样我就不会为以后的输出建立巨大的列表。 我只希望java打开输入文件,并运行它,在它通过时半实时地写入输出文件。

我对流媒体完全陌生。 我了解流和 lamba 等的基本思想,但不知道实现和语法等的细节。 (例如,我对我在某些示例中看到的 :: 语法感到困惑(...

无论如何 - 下面是一个基本上完成我想做的事情的示例......

我想知道如何使用流接口来做到这一点,以便主文件(可能非常大(不需要同时在内存中。

谢谢!

Set<String> set1 = fileToSet(file1);
Set<String> set2 = fileToSet(file2);
List<String> output1 = new ArrayList<>();
List<String> output2 = new ArrayList<>();
List<String> output3 = new ArrayList<>();
for (String line : Files.readAllLines(inputPath)) {
String subString = line.substring(0,10);
if (set1.contains(subString)) {
output1.add(line);
}
else if (set2.contains(subString)) {
output2.add(line);
}
else {
output3.add(line);
}
}
//write out all 3 files from the collected lists

您可以使用forEach来处理每一行并在 你也可以使用BufferedWriter来写出与你的逻辑匹配的行的内容:

try (Stream<String> lines = Files.lines(path);
BufferedWriter writer1 = new BufferedWriter(new FileWriter("file1"));
BufferedWriter writer2 = new BufferedWriter(new FileWriter("file2"));
BufferedWriter writer3 = new BufferedWriter(new FileWriter("file3"))) {
lines.forEach((line) -> {
String subString = line.substring(0, 10);
try {
BufferedWriter writerToUse;
if (set1.contains(subString)) {
writerToUse = writer1;
} else if (set2.contains(subString)) {
writerToUse = writer2;
} else {
writerToUse = writer3;
}
writerToUse.append(line);
writerToUse.newLine();
// lambda cannot throw checked exception not declared in the 
// functional interface. So you have to catch IO exception in
} catch (IOException e) {
// TODO error processing
}
});
}

这样的事情应该有效:

Files.lines(Paths.get(inputPath)).forEach(line -> {
// do your logic with line
...
});

您还应考虑将过滤后的数据直接写入输出文件,而不是将其收集到内存中。输出文件可能在文件读取之前打开。

最新更新