Ben*_*Ben 2 java stream java-8
要清楚 - 这里的目标是使用输入和输出流,这样我以后就不会为输出构建大量列表.我只是想让java打开输入文件,并运行它,在半实时写入输出文件.
我对溪流来说是全新的.我理解了stream和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
Run Code Online (Sandbox Code Playgroud)
您可以使用a forEach来处理每一行并应用您的实际逻辑,您也可以使用a 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
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1496 次 |
| 最近记录: |