java如何创建流式传输到http响应的文件
我正在编写一个web应用程序,希望用户能够单击链接并获得文件下载
我有一个接口在第三方库中,我无法更改:
writeFancyData(File file, Data data);
有没有一种简单的方法可以创建一个文件对象,我可以将它传递给这个方法,当写入该方法时,它将流式传输到HTTP响应
注:
显然,我可以只写一个临时文件,然后将其读回,然后将其写入http响应的输出流。然而,我要寻找的是一种避免文件系统IO的方法。理想情况下,创建一个伪文件,该文件在写入时将改为写入http响应的输出流
例如
writeFancyData(new OutputStreamBackedFile(response.getOutputStream()), data);
我需要使用writeFancyData方法,因为它以我无法复制的非常特定的格式写入文件
# 1 楼答案
当dlawrence编写API时,不可能确定API对文件做了什么
非java方法是创建named pipe。您可以在程序中为管道建立读取器,在该路径上创建一个文件并将其传递给API
在做任何事情之前,我建议分析性能并验证磁盘I/o确实是一个瓶颈
# 2 楼答案
假设writeFancyData是一个黑盒,这是不可能的。作为一个思想实验,考虑一个实现这样的事情的写数据:
由于任何扩展版本的文件都只能返回路径名,因此无法将所需的数据输入到该方法中。如果签名包含某种类型的流,您将处于更好的位置,但由于您只能传入一个文件,因此无法完成此操作
实际上,该实现可能是FileInputStream或FileReader类的一种,它们使用File对象作为名称,然后调用本机方法来获取文件描述符并处理实际的i/o
# 3 楼答案
考虑到该API,您所能做的最好的事情就是为它提供RAM磁盘文件系统中的文件的
File
并针对API提交错误/缺陷报告,请求使用
Writer
或OutputStream
参数的重载