如何使用java高效下载大型csv文件

时间:2012-04-16 21:02:29

标签: java large-files

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

2 个答案:

答案 0 :(得分:2)

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

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

永远不是StringBuffer或更好的StringBuilder。更好地将其流出。如果你不能(不能)调用setContentength,则输出会被分块(没有预测进度)。

答案 1 :(得分:0)

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