欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大文件下载---之内存溢出问题解决

程序员文章站 2022-03-19 17:52:00
...

我是在log日志下载的时候出现的错误,查了之后发现是文件过大造成内存溢出,因而下载出错。

报错:java.lang.OutOfMemoryError: Java heap space

正确代码:

@RequestMapping("/download")
  public void download (HttpServletResponse response,@Param("url")String url) throws IOException{
	  String path = request.getSession().getServletContext().getRealPath("vod"+File.separator+"log"+File.separator+url); 
	  try {   
          File file = new File(path);   
            if (file.exists()) {   
               String filename = file.getName();   
               InputStream fis = new BufferedInputStream(new FileInputStream( file));   //用BufferedInputStream读取文件
                response.reset();   
                response.setContentType("application/x-download");
                response.addHeader("Content-Disposition","attachment;filename="+ new String(filename.getBytes(),"iso-8859-1"));
                response.addHeader("Content-Length", "" + file.length());   
               OutputStream toClient = new BufferedOutputStream(response.getOutputStream());   
              response.setContentType("application/octet-stream");   
                byte[] buffer = new byte[1024];   
                int i = -1;   
                while ((i = fis.read(buffer)) != -1) {   //不能一次性读完,大文件会内存溢出(不能直接fis.read(buffer);)
                    toClient.write(buffer, 0, i);  
                    
                }   
                fis.close();   
                toClient.flush();   
                toClient.close();  
            } else {   
               PrintWriter out = response.getWriter();   
               out.print("<script>");   
               out.print("alert(\"not find the file\")");   
               out.print("</script>");   
            }   
        } catch (IOException ex) {   
           PrintWriter out = response.getWriter();   
               out.print("<script>");   
               out.print("alert(\"not find the file\")");   
               out.print("</script>");   
        }   
  }