有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建流式传输到http响应的文件

我正在编写一个web应用程序,希望用户能够单击链接并获得文件下载

我有一个接口在第三方库中,我无法更改:

writeFancyData(File file, Data data);

有没有一种简单的方法可以创建一个文件对象,我可以将它传递给这个方法,当写入该方法时,它将流式传输到HTTP响应

注:

显然,我可以只写一个临时文件,然后将其读回,然后将其写入http响应的输出流。然而,我要寻找的是一种避免文件系统IO的方法。理想情况下,创建一个伪文件,该文件在写入时将改为写入http响应的输出流

例如

writeFancyData(new OutputStreamBackedFile(response.getOutputStream()), data);

我需要使用writeFancyData方法,因为它以我无法复制的非常特定的格式写入文件


共 (3) 个答案

  1. # 1 楼答案

    dlawrence编写API时,不可能确定API对文件做了什么

    非java方法是创建named pipe。您可以在程序中为管道建立读取器,在该路径上创建一个文件并将其传递给API

    在做任何事情之前,我建议分析性能并验证磁盘I/o确实是一个瓶颈

  2. # 2 楼答案

    假设writeFancyData是一个黑盒,这是不可能的。作为一个思想实验,考虑一个实现这样的事情的写数据:

    public void writeFancyData(File file, Data data){
        File localFile = new File(file.getPath());
        ... 
        // process data from file
        ...
    }
    

    由于任何扩展版本的文件都只能返回路径名,因此无法将所需的数据输入到该方法中。如果签名包含某种类型的流,您将处于更好的位置,但由于您只能传入一个文件,因此无法完成此操作

    实际上,该实现可能是FileInputStream或FileReader类的一种,它们使用File对象作为名称,然后调用本机方法来获取文件描述符并处理实际的i/o

  3. # 3 楼答案

    考虑到该API,您所能做的最好的事情就是为它提供RAM磁盘文件系统中的文件的File

    并针对API提交错误/缺陷报告,请求使用WriterOutputStream参数的重载