gpt4 book ai didi

Java 8 流和并发写入

转载 作者:行者123 更新时间:2023-12-02 04:26:33 25 4
gpt4 key购买 nike

我有这样的代码

    public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
List<String> matches = new Vector<>(); // Race condition for ArrayList??
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("AHugeFile.txt")));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt")));
reader.lines().parallel()
.filter(s -> s.matches("someFancyRegEx"))
.forEach(s -> {
matches.add(s);
try {
writer.write(s);
writer.newLine();
} catch (Exception e) {
System.out.println("error");
}
}
);
out.println("Processing took " + (System.currentTimeMillis() - start) / 1000 + " seconds and matches " + matches.size());
reader.close();
writer.flush();
writer.close();
}

我注意到,如果我在第 3 行用 ArrayList 替换 Vector,我每次都会在匹配中得到不同的结果。我只是想亲自接触 Streams,但假设 forEach 同时执行并尝试写入 ArrayList,这会丢失一些写入!使用 vector ,结果是一致的。

我有两个问题:

  1. 我关于 ArrayList 导致 RACE 的推理正确吗?
  2. 鉴于“写入”也在同一终端操作中写入文件,“写入”是否可能会丢失某些行?在我的测试中,运行该程序几次,结果似乎与写出的正确行数一致。

最佳答案

首先要做的事情是:定义您是否关心行的写入顺序; .forEach() strips the ORDERED characteristic of a Spliterator (been there, done that) .

第二:使用Java 8提供的哪些工具;它有两个非常方便的方法,分别是 Files.lines()Files.write()

第三:正确处理你的资源!您的代码中无法保证文件描述符将正确关闭。

第四:.matches() 每次都会重新创建一个Pattern,并且您总是使用相同的正则表达式进行过滤...您正在浪费资源。

第五:鉴于 BufferedWriter 的 write 方法是同步的,因此并行性不会带来太多好处。

这是我的做法:

public static void writeFiltered(final Path srcFile, final Path dstFile,
final String regex)
throws IOException
{
final Pattern pattern = Pattern.compile(regex);

final List<String> filteredLines;

try (
// UTF-8 by default
final Stream<String> srcLines = Files.lines(srcFile);
) {
filteredLines = srcLines.map(pattern::matcher)
.filter(Matcher::matches)
.collect(Collectors.toList());
}

// UTF-8 by default
Files.write(dstFile, filteredLines);
}

关于Java 8 流和并发写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com