【问题标题】:How to efficiently download large csv file using java如何使用java有效地下载大型csv文件
【发布时间】:2012-04-28 05:29:10
【问题描述】:

我需要提供一项功能,让用户可以在我的 Web 应用程序中下载 excel/csv 格式的报告。一旦我在 Web 应用程序中创建了一个创建 excel 的模块,然后读取它并发送到浏览器。它工作正常。这次我不想生成 excel 文件,因为我对文件系统没有那种级别的控制。我想一种方法是在 StringBuffer 中生成适当的代码并设置正确的内容类型(我不确定这种方法)。其他团队也有这个功能,但是当数据非常大时他们会很挣扎。考虑到数据的大小,提供此功能的最佳方式可能非常庞大。是否可以在没有客户端通知的情况下以块的形式发送数据(下载延迟除外)。 我忘记添加的一个问题是,当数据非常大时,它也会在服务器端产生问题(cpu 利用率和内存消耗)。是否可以读取固定数量的记录,例如 500 条,将其发送给客户端,然后再读取 500 条直到完成。

【问题讨论】:

    标签: java large-files


    【解决方案1】:

    您还可以生成 HTML 而不是 CSV,但仍将内容类型设置为 Excel。这对于着色和样式文本非常有用。

    当客户端接受压缩时,您也可以使用 gzip 压缩。通常有标准的方法,比如 servlet 过滤器。

    永远不要使用 StringBuffer 或更好的 StringBuilder。最好把它流出来。如果您不(不能)调用 setContentength,则输出会分块(没有预测进度)。

    【讨论】:

    • 你能解释一下吗:永远不是 StringBuffer 或更好的 StringBuilder。最好把它流出来。
    • StringBuffer 的性能低于后来的 StringBuilder,因为 StringBuffer 具有(不必要的)同步。当然,您不希望首先在 StringB* 中收集很多内容,然后将其流出。作为一个流式传输的管道,它的效率要高得多,尤其是在多用户场景中。
    • 我在数据库中查询大约 1000 条记录,然后将其发送给客户端,然后获取下一批。这大大减少了我的内存占用。我已经在探查器中测试并检查了内存,它工作正常。现在我的应用程序不使用大量内存。我可以在分析器中看到,只要使用的内存达到临界级别,就会被垃圾回收。
    【解决方案2】:
    URL url = new URL("http://localhost:8080/Works/images/address.csv");  
    
                    response.setHeader("Content-Type", "text/csv");  
                    response.setHeader("Content-disposition", "attachment;filename=myFile.csv");
    
                    URLConnection connection = url.openConnection();
                    InputStream stream = connection.getInputStream();
    
                    BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
                    int len;
                        byte[] buf = new byte[1024];
                        while ((len = stream.read(buf)) > 0) {
                          outs.write(buf, 0, len);
                        }
                        outs.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2019-10-22
      • 1970-01-01
      • 2019-04-02
      • 2019-03-27
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多