我正在使用IBM Websphere Application Server v6和Java
1.4,并试图将CSV大文件写入ServletOutputStream以便用户下载。目前文件大小为50-750MB。
较小的文件并不会引起太大的问题,但是对于较大的文件,似乎是将其写入堆中,这随后导致OutOfMemory错误并导致整个服务器停机。
这些文件只能通过HTTPS提供给经过身份验证的用户,这就是为什么我通过Servlet而不是仅仅将它们粘贴在Apache中为它们提供服务的原因。
我正在使用的代码是(消除了一些绒毛):
resp.setHeader("Content-length", "" + fileLength);
resp.setContentType("application/vnd.ms-excel");
resp.setHeader("Content-Disposition","attachment; filename=\"export.csv\"");
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(path);
byte[] buffer = new byte[1024];
int bytesRead = 0;
do
{
bytesRead = inputStream.read(buffer, offset, buffer.length);
resp.getOutputStream().write(buffer, 0, bytesRead);
}
while (bytesRead == buffer.length);
resp.getOutputStream().flush();
}
finally
{
if(inputStream != null)
inputStream.close();
}
在FileInputStream似乎没有,如果我写到另一个文件或只是删除完全写入内存使用情况似乎并不成为一个问题而导致问题。
我在想的是将resp.getOutputStream().write其存储在内存中,直到可以将数据发送到客户端为止。因此,可能会读取整个文件并将其存储在resp.getOutputStream()导致我的内存问题并崩溃的地方!
我已经尝试过缓冲这些流,还尝试过使用from的Channels
java.nio,这些似乎都没有对我的内存问题产生任何影响。我还刷新了OutputStream循环的每个迭代一次,并在循环之后刷新了一次,但这没有帮助。