gpt4 book ai didi

java - 使用并行流到 FileWriter 可以吗?

转载 作者:行者123 更新时间:2023-12-02 01:58:34 27 4
gpt4 key购买 nike

我想将流写入文件。但是,流很大(写入文件时只有几 GB),所以我想使用并行。在过程结束时,我想写入文件(我正在使用 FileWriter)

我想问一下这是否有可能导致文件出现任何问题。

这是一些代码

将流写入文件的函数

public static void writeStreamToFile(Stream<String> ss, String fileURI) {
try (FileWriter wr = new FileWriter(fileURI)) {
ss.forEach(line -> {
try {
if (line != null) {
wr.write(line + "\n");
}
} catch (Exception ex) {
System.err.println("error when write file");
}
});
} catch (IOException ex) {
Logger.getLogger(OaStreamer.class.getName()).log(Level.SEVERE, null, ex);
}
}

我如何使用我的信息流

Stream<String> ss = Files.lines(path).parallel()
.map(x->dosomething(x))
.map(x->dosomethingagain(x))

writeStreamToFile(ss, "path/to/output.csv")

最佳答案

是的,像您使用的那样使用FileWriter就可以了,我还有其他一些方法可能对您有帮助。

当您处理大文件时,FileChannel 可能比标准IO 更快。以下代码使用 FileChannel 将 String 写入文件:

@Test
public void givenWritingToFile_whenUsingFileChannel_thenCorrect()
throws IOException {
RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
FileChannel channel = stream.getChannel();
String value = "Hello";
byte[] strBytes = value.getBytes();
ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
buffer.put(strBytes);
buffer.flip();
channel.write(buffer);
stream.close();
channel.close();

// verify
RandomAccessFile reader = new RandomAccessFile(fileName, "r");
assertEquals(value, reader.readLine());
reader.close();
}

引用:https://www.baeldung.com/java-write-to-file

您可以将Files.write与流操作一起使用,如下所示,将Stream转换为Iterable:

Files.write(Paths.get(filepath), (Iterable<String>)yourstream::iterator);

例如:

Files.write(Paths.get("/dir1/dir2/file.txt"),
(Iterable<String>)IntStream.range(0, 1000).mapToObj(String::valueOf)::iterator);

如果您有一些自定义对象流,则始终可以添加 .map(Object::toString) 步骤来应用 toString() 方法。

标题

关于java - 使用并行流到 FileWriter 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51978143/

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