大文件下載---之內存溢出問題解決

我是在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>");   
        }   
  }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章