Ошибка при загрузке больших файлов с сервера с использованием Java
Я новичок в обработке файлов в Java. Я написал код, который должен загрузить файл с сервера. Код работает для файлов размером до 70 МБ. Если загружаются большие файлы, возникает исключение.
SRVE0260E: Сервер не может использовать страницу ошибки, указанную для вашего приложения, для обработки оригинального исключения, напечатанного ниже.
Исходное исключение: Сообщение об ошибке: java.lang.OutOfMemoryError Код ошибки: 500 Целевой сервлет: пусто Стек ошибок: java.lang.OutOfMemoryError "в app.web.webcontroller.webAction.DownloadCsvAction.execute(DownloadCsvAction.j:) atj 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.java:397)" " в javax.servlet.http.HttpServlet.service(HttpServlet.java:7) "" на 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.systemControlime.ppl Filter.doFilter_http(RequestTimerFilter.java:73)" " в app.systemController.RequestTimerFilter.doFilter(RequestTimerFilter.java:61)" " в com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.jFilter (18) Filter "" на com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)" " на com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilava com ")..ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:858)" " at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:8ibm.wava:8ibm.wava:8ibm.wava:8ibm.wava:8ibm.wava:8ibm.wava:8ibm.wava:8ibm.wava:8ibm. com).webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)" " в com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)" " на com.ibweb.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.htt.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)" " в com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:16ibm.java:16ibm.java:16ibm. at. com) at.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)" " в com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)" " в com.ibm.io.async.AsyncFuture.com Java:138)" " в com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)" " в com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)" " в com.ibm.io.async.Result Обработчик $2.run(ResultHandler.java:905)" " в com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550)"
Исключение страницы ошибки: Сообщение об ошибке: java.lang.IllegalStateException: SRVE0199E: OutputStream уже получен Код ошибки: 0 Целевой сервлет: пусто Стек ошибок: java.lang.IllegalStateException: SRVE0199E: OutputStream уже получен "на com.ibm.ws.webcontainer.srt.SRTServletResponse.getWriter(SRTServletResponse.java:719)" " в org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:187)" " в org.apache.jasmper Java: 175) "" в org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:262)" " в org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java: at1: org):.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:137)" " в com.ibm._jsp._Error500._jspService(_Error500.java:177)" " в com.ibm.ws.jsphp..service(HttpJspBase.java:98)" " в javax.servlet.http.HttpServlet.service(HttpServlet.java:831)" " в com.ibm.ws.webcontainer.servlet.ServletW rapper.service (ServletWrapper.java:1530) "" в com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1470)" " в 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.WebAppFilterjA 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.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericSm.werv:12) atwlet.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(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 (Servlet:987)" " в com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)" " в com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest (ServletWrapperImpljj) " at 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.ioback.inSyncAb. 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.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();
Также в фрагменте кода, скажите, пожалуйста, есть ли способ оптимизировать мой код, чтобы сделать его быстрее.
2 ответа
Вы создаете буфер с размером файла, который вы хотите передать. С большими файлами вы получите именно то, что произошло: OutOfMemoryError, так как в вашей куче недостаточно места для такого большого количества данных.
Самое простое решение - выбрать меньший размер буфера, например 64 КБ. Это не должно заметно ухудшить производительность:
byte[] buffer = new byte[64 * 1024];
Этот код убивает ваше приложение:
int size=(int)downloadFile.length()+1;
byte[] buffer = new byte[size];
Потому что вы используете слишком большой буфер, поэтому JVM будет OutOfMemory
, Вы должны разбить ваш файл на небольшой кусок, как byte[] buffer = new byte[1024]