2015-02-12 3 views
0

Я новичок в обработке файлов на Java. Я написал код, который должен загрузить файл с сервера. Код работает с файлами размером до 70 МБ. Если загружаются большие файлы, он генерирует исключение.Ошибка при загрузке больших файлов с сервера с помощью Java

SRVE0260E: Сервер не может использовать страницу с ошибкой, указанную для вашего приложения, для обработки Исходного Исключения, указанного ниже.

Оригинал Исключение: Сообщение об ошибке: java.lang.OutOfMemoryError Код ошибки: 500 Target Servlet: нулевой Ошибка Stack: java.lang.OutOfMemoryError "в app.web.webcontroller.webAction.DownloadCsvAction.execute (DownloadCsvAction.java:49) « » на org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:422) « » на org.apache.struts.action.RequestProcessor.process (RequestProcessor.java:228) « » на org.apache.struts.action.ActionServlet.process (ActionServlet.java:1164) « » на org.apache.struts.action.ActionServlet.doGet (ActionServlet.ja va: 397) « » на странице javax.servlet.http.HttpServlet.service (HttpServlet.java:718) « » на странице javax.servlet.http.HttpServlet.service (HttpServlet.java:831) « » на com. ibm.ws.webcontainer.servlet.ServletWrapper.service (ServletWrapper.java:1530) " " на com.ibm.ws.webcontainer.servlet.ServletWrapper.service (ServletWrapper.java:1470) " " на com.ibm. ws.webcontainer.filter.WebAppFilterChain.doFilter (WebAppFilterChain.java:131) " "в app.systemController.RequestTimerFilter.doFilter_http (RequestTimerFilter.java:73)" " в app.systemController.RequestTimerFilter.doFilter (RequestTimerFilter.java: 61) « » на com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:188) « » на com.ibm.ws.webcont ainer.filter.WebAppFilterChain.doFilter (WebAppFilterChain.java:116) « » на com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter (WebAppFilterChain.java:77) « » на com.ibm.ws.webcontainer. filter.WebAppFilterManager.doFilter (WebAppFilterManager.java:858) " " в com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:824) " " на com.ibm.ws.webcontainer.servlet. ServletWrapper.handleRequest (ServletWrapper.java:458) " " в com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest (ServletWrapperImpl.java:175) " " в com.ibm.ws.webcontainer.servlet.CacheServletWrapper. handleRequest (CacheServletWrapper.java:91) " " на com.ibm.ws.webcontainer.WebContainer.handleRequest (WebContainer.java:862) " " на com.ibm.w s.webcontainer.WSWebContainer.handleRequest (WSWebContainer.java:1583) " " на com.ibm.ws.webcontainer.channel.WCChannelLink.ready (WCChannelLink.java:178) " " на com.ibm.ws.http. channel.inbound.impl.HttpInboundLink.handleDiscrimination (HttpInboundLink.java:455) " " на com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation (HttpInboundLink.java:384) " " at com. ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete (HttpICLReadCallback.java:83) " " в com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted (AioReadCompletionListener.java:165) " "at com.ibm.io.async.AbstractAsyncFuture.invokeCallback (AbstractAsyncFuture.java:217)" "в com.ibm.io.async.AsyncChannelFuture.fireCompletionActions (AsyncChannelFuture.java:161)" "на com.ibm.io.async.AsyncFuture.completed (AsyncFuture.java:138)" "на com.ibm.io.async.ResultHandler.complete (ResultHandler.java:204)" "на com.ibm .io.async.ResultHandler.runEventProcessingLoop (ResultHandler.java: 775) « » на com.ibm.io.async.ResultHandler $ 2.run (ResultHandler.java:905) « » на com.ibm.ws.utils.ThreadPool $ Worker.run (ThreadPool.java:1550)»

Ошибка Page Исключение: Сообщение об ошибке: java.lang.IllegalStateException: SRVE0199E: OutputStream уже получен код Ошибка: 0 Target Servlet: нулевой Ошибка Stack: java.lang.IllegalStateException: SRVE0199E: OutputStream уже Полученный "в com.ibm.ws.webcontainer.srt.SRTServletResponse.getWriter (SRTServletResponse.java:719)" "в org.apache.jasper.runtime.JspWriterImpl.initOut (JspWriterImpl.java:187)" "в о rg.apache.jasper.runtime.JspWriterImpl.flushBuffer (JspWriterImpl.java:175) " " на org.apache.jasper.runtime.PageContextImpl.release (PageContextImpl.java:262) " " на org.apache.jasper. runtime.JspFactoryImpl.internalReleasePageContext (JspFactoryImpl.java:177) " "в org.apache.jasper.runtime.JspFactoryImpl.releasePageContext (JspFactoryImpl.java:137)" " в com.ibm._jsp._Error500._jspService (_Error500. java: 177) « » на com.ibm.ws.jsp.runtime.HttpJspBase.service (HttpJspBase.java:98) « » на странице javax.servlet.http.HttpServlet.service (HttpServlet.java:831) « msgstr "" "" "."в com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter (WebAppFilterChain.java:104)" "в com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter (WebAppFilterChain.java:77)" " в com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter (WebAppFilterManager.java:858) " " на com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:824) " " at com .ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:458) " " на com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest (ServletWrapperImpl.java:175) " " на com.ibm .wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest (GenericServletWrapper.java:121) " " на com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRe Квест (AbstractJSPExtensionServletWrapper.java:239) « » на com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward (WebAppRequestDispatcher.java:330) « » на com.ibm.ws.webcontainer.webapp.WebApp.sendError (WebApp.java:3209) « » на com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:987) « » на com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper. java: 458) « » на com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest (ServletWrapperImpl.java:175) « » на com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest (CacheServletWrapper.java: 91) « » на com.ibm.ws.webcontainer.WebContainer.handleRequest (WebContainer.java:862) « » на com.ibm.ws.webcontainer.WSWebContainer. handleRequest (WSWebContainer.java:1583) " " на com.ibm.ws.webcontainer.channel.WCChannelLink.ready (WCChannelLink.java:178) " " на com.ibm.ws.http.channel.inbound.impl. HttpInboundLink.handleDiscrimination (HttpInboundLink.java:455) " " на com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation (HttpInboundLink.java:384) " " на com.ibm.ws.http. channel.inbound.impl.HttpICLReadCallback.complete (HttpICLReadCallback.java:83) " " на com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted (AioReadCompletionListener.java:165) " " на com.ibm. io.async.AbstractAsyncFuture.invokeCallback (AbstractAsyncFuture.java:217) " " в com.ibm.io.async.AsyncChannelFuture.fireCompletionActions (AsyncChannelFuture.java: 161) « » на com.ibm.io.async.AsyncFuture.completed (AsyncFuture.java:138) « » на com.ibm.io.async.ResultHandler.complete (ResultHandler.java:204) « msgstr "" "" ". .ws.util.ThreadPool $ Worker.run (ThreadPool.java:1550)»

Это исключение печатается в загруженном файле вместо того, чтобы исходные данные.

response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\""); 
     response.setContentType("application/octet-stream"); 
     File downloadFile = new File(fileUrl\fileName); 
     OutputStream out = response.getOutputStream(); 
     FileInputStream in = new FileInputStream(downloadFile); 
     int size=(int)downloadFile.length()+1; 
     byte[] buffer = new byte[size]; 
     int length; 
     while ((length = in.read(buffer)) != -1){ 
      out.write(buffer, 0, length); 
     } 
     in.close(); 
     out.flush(); 

Также в фрагменте кода, пожалуйста, скажите мне, есть ли способ оптимизировать мой код, чтобы сделать его быстрее.

+0

Взгляните на это сообщение http://stackoverflow.com/questions/17627508/outofmemoryerror-when-trying-to-read-write-from-a-huge-text -файл –

ответ

1

Создается буфер с размером файла, который вы хотите перенести. С большими файлами вы получите только то, что произошло: OutOfMemoryError, поскольку на вашей куче недостаточно места для большого количества данных.

Самое простое решение - выбрать меньший размер буфера, например 64k. Это не должно привести к снижению производительности заметно:

byte[] buffer = new byte[64 * 1024]; 
0

Этот код убить приложение:

int size=(int)downloadFile.length()+1; 
byte[] buffer = new byte[size]; 

Поскольку вы используете слишком большой буфер, так JVM будет OutOfMemory. Вы должны разделить свой файл на небольшой кусок, например byte[] buffer = new byte[1024]

Смежные вопросы