gpt4 book ai didi

java - 流式传输文件并在读取后移动它们

转载 作者:行者123 更新时间:2023-12-01 07:20:46 27 4
gpt4 key购买 nike

我想流式传输文件中包含的行,但是一旦处理完每个文件就将其移动到另一个文件夹。

当前过程如下:

说明:

  • 我创建StreamFile
  • 我为他们每个人创建一个BufferedReader
  • flatMapStreamBufferedReader
  • 我打印每一行。

  • 代码(为简单起见,省略了异常(exception)):
    (1)    Stream.generate(localFileProvider::getNextFile)
    (2) .map(file -> new BufferedReader(new InputStreamReader(new FileInputStream(file))))
    (3) .flatMap(BufferedReader::lines)
    (4) .map(System.out::println)
    .MOVE_EACH_FILE_FROM_INPUT_FOLDER_TO_SOME_OTHER_FOLDER;

    完全读取后,是否可以 移动每个文件并继续处理流中的其他文件?

    最佳答案

    您可以chain a close action到流,如果使用flatMap,它将自动执行:

    Stream.generate(localFileProvider::getNextFile).takeWhile(Objects::nonNull)

    .flatMap(file -> {
    try {
    Path p = file.toPath();
    return Files.lines(p, Charset.defaultCharset()).onClose(() -> {
    try { // move path/x/y/z to path/x/y/z.moved
    Files.move(p, p.resolveSibling(p.getFileName()+".moved"));
    } catch(IOException ex) { throw new UncheckedIOException(ex); }
    });
    } catch(IOException ex) { throw new UncheckedIOException(ex); }
    })

    .forEach(System.out::println);

    the documentation of onClose 必须声明:

    Close handlers are run when the close() method is called on the stream, and are executed in the order they were added.



    因此,在已经存在的关闭处理程序之后执行移动关闭处理程序,该处理程序将关闭用于读取行的文件句柄。

    我使用 Charset.defaultCharset()来模拟问题代码的嵌套构造函数 new InputStreamReader(new FileInputStream(file)))的行为,但是通常,您应该使用固定的字符集,例如 Files.lines的默认UTF-8。

    关于java - 流式传输文件并在读取后移动它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61914029/

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