当前位置: 首页 > 面试题库 >

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

许丁雷
2023-03-14
问题内容

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

当前的过程是这样的:

说明:

  1. 我创建StreamFile小号
  2. BufferedReader为他们每个人创建一个
  3. flatMap到线StreamBufferedReader
  4. 我打印每一行。

代码(为简单起见,省略了例外):

(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;

一旦每个文件都已被完全读取 ,是否可以 移动它 并继续处理流中的其他文件?


问题答案:

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



 类似资料:
  • 我正在创建一个文件传输路径,该路径使用移动来设置一个动态路径,在成功传输文件后,文件将在该路径中移动。我还设置了一个通知程序来跟踪文件传输事件。 由于移动路径是动态的,我需要得到文件传输后移动文件的路径。该路径如何在通知程序中显示?

  • 问题内容: 我正在尝试将csv文件作为附件下载流式传输。CSV文件的大小已达到4MB或更大,我需要一种让用户主动下载文件的方法,而不必等待所有数据都先创建并提交到内存中。 我首先使用了我自己的基于Django类的文件包装器。那失败了。然后,我在这里看到了一种使用生成器流式传输响应的方法: 如何使用Django流式传输HttpResponse 当我在生成器中引发错误时,可以看到我正在使用该函数创建正

  • 问题内容: 我正在构建需要扩展的Java服务器。Servlet之一将提供存储在Amazon S3中的图像。 最近,在负载下,我的VM内存不足,这是在我添加了为图像提供服务的代码之后,因此,我很确定流较大的servlet响应会引起我的麻烦。 我的问题是:从数据库或其他云存储中读取时,如何编写Java Servlet来将大型(> 200k)响应流回浏览器,是否有最佳实践? 我考虑过将文件写入本地临时驱

  • 问题内容: 我正在构建需要扩展的Java服务器。Servlet之一将提供存储在Amazon S3中的图像。 最近在负载下,我的VM内存不足,这是在添加代码以提供图像服务之后,因此,我很确定流较大的servlet响应会引起麻烦。 我的问题是:从数据库或其他云存储读取数据时,如何编写Java Servlet以便将大型(> 200k)响应流回浏览器,是否有最佳实践? 我考虑过将文件写入本地临时驱动器,然