您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

您可以将关闭动作链接到流,如果发生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);

状态文档onClose很重要:

当在close()流上调用方法时,将运行关闭处理程序,并按添加顺序执行。

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

我曾经Charset.defaultCharset()模仿new InputStreamReader(new FileInputStream(file)))问题代码的嵌套构造函数的行为,但通常情况下,应尽可能使用固定的字符集,例如Files.lines认的UTF-8。

其他 2022/1/1 18:27:30 有373人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶