gpt4 book ai didi

Java 8 流 : streaming files and delete after read

转载 作者:行者123 更新时间:2023-12-01 13:01:59 24 4
gpt4 key购买 nike

我想流式传输文件中包含的行,但在处理完每个文件后将其删除。

目前的流程是这样的:

解释:

  1. 我创建一个文件流
  2. 我为它们中的每一个创建一个 BufferedReader
  3. 我 flatMap 到 BufferedReader 的行 Stream
  4. 我打印每一行。

代码:

(1)    Stream.generate(localFileProvider::getNextFile)
(2) .map(file -> return new BufferedReader(new InputStreamReader(new FileInputStream(file))))
(3) .flatMap(BufferedReader::lines)
(4) .map(System.out::println);

是否可以在每个文件被完全读取后将其删除并继续处理流中的其他文件?

谢谢!

最佳答案

当您使用 flatMap 时,函数返回的流在处理后将自动关闭。您只需要在打开 InputStream 时添加一个选项,指定在关闭时应删除其基础文件。

假设 localFileProvider.getNextFile() 返回一个 java.io.File,代码如下所示

Stream.generate(localFileProvider::getNextFile)
.takeWhile(Objects::nonNull) // stop on null, otherwise, it’s an infinite stream

// the actual operation regarding your question:
.flatMap(file -> {
try { return new BufferedReader(new InputStreamReader(
Files.newInputStream(file.toPath(), StandardOpenOption.DELETE_ON_CLOSE)))
.lines();
} catch(IOException ex) { throw new UncheckedIOException(ex); }
})

// the example terminal operation
.forEach(System.out::println);

您需要使用 Files.newInputStream(Path, OpenOption...)而不是 new FileInputStream(...) 来指定特殊的打开选项。所以上面的代码通过toPath()File转换为Path;如果 getNextFile() 返回一个 String,您需要 Paths.get(file)相反。

关于Java 8 流 : streaming files and delete after read,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61898835/

24 4 0