我想流式传输文件中包含的行,但是一旦处理完每个文件就将其移动到另一个文件夹。
当前的过程是这样的:
说明:
Stream
的File
小号BufferedReader
为他们每个人创建一个flatMap
到线Stream
的BufferedReader
代码(为简单起见,省略了例外):
(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)响应流回浏览器,是否有最佳实践? 我考虑过将文件写入本地临时驱动器,然