首页 文章

使用Java从服务器下载大文件时出错

提问于
浏览
0

我是Java中的文件处理新手 . 我编写了一个代码,可以从服务器下载文件 . 该代码适用于大小为70 MB的文件 . 如果下载大文件,则会抛出异常 .

SRVE0260E:服务器无法使用为您的应用程序指定的错误页面来处理下面打印的原始异常 . 原始异常:错误消息:java.lang.OutOfMemoryError错误代码:500目标Servlet:null错误堆栈:java.lang.OutOfMemoryError“at app.web.webcontroller.webAction.DownloadCsvAction.execute(DownloadCsvAction.java:49)”“at at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:422)“”at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)“”at org.apache.struts.action . ActionServlet.process(ActionServlet.java:1164)“”at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)“”at javax.servlet.http.HttpServlet.service(HttpServlet.java:718) “”在com.ibm.ws的javax.servlet.http.HttpServlet.service(HttpServlet.java:831)“”com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1530)“” .webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1470)“”at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)“”at app.systemController.RequestTimer在com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)的app.systemController.RequestTimerFilter.doFilter(RequestTimerFilter.java:61)“”上的Filter.doFilter_http(RequestTimerFilter.java:73)“” “”com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)“”at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)“”at com .ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:858)“”在com.ibm.ws的com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:824)“” .webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)“”在com.ibm.ws.webcontainer.servlet的com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)“” .cacheServletWrapper.handleRequest(CacheServletWrapper.java:91)“”在com.ibm.ws.webcon的com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:862)“” tainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)“”at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:178)“”at com.ibm.ws.http.channel.inbound . impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)“”在com.ibm.ws.http的com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)“” . 在com.ibm.io上的com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)“”中的channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)“” . 在com.ibm.io.async.AsyncFuture.completed(AsyncFuture . java:138)“”at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)“”at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)“”at 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目标Servlet:null错误堆栈: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.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:175)“”at org.apache.jasper.runtime . PageContextImpl.release(PageContextImpl.java:262)“”org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:177)“”at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java: 137)“”在com.ibm._jsp._Error500._jspService(_Error500.java:177)“”at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:98)“”at ja vax.servlet.http.HttpServlet.service(HttpServlet.java:831)“”at atcom.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1530)“”在com.ibm的com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1470)“” . ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:104)“”位于com.ibm.ws.webcontainer的com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)“” . filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:858)“”位于com.ibm.ws.webcontainer.servlet.ServletWrapper的com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:824)“” . handleRequest(ServletWrapper.java:458)“”at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)“”at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper . java:121)“”at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:239)“”at com.ibm.ws.webcontaine r.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:330)“”位于com.ibm.ws.webcontainer.servlet的com.ibm.ws.webcontainer.webapp.WebApp.sendError(WebApp.java:3209)“” . ServletWrapper.handleRequest(ServletWrapper.java:987)“”at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)“”at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest( ServletWrapperImpl.java:175)“”at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)“”at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:862) “”com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)“”at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:178)“”at 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)“” at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)“”at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)“”at com.ibm.io.async .AsyncFuture.completed(AsyncFuture.java:138)“”at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)“”at 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 回答

  • 1

    您可以使用要传输的文件大小创建缓冲区 . 对于大文件,您将获得刚刚发生的事情:OutOfMemoryError,因为堆上没有足够的空间来存储那么多数据 .

    最简单的解决方法是选择较小的缓冲区大小,如64k . 这不应该明显降低性能:

    byte[] buffer = new byte[64 * 1024];
    
  • 2

    此代码会终止您的应用:

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

    因为你使用太大的缓冲区所以JVM将是 OutOfMemory . 您应该将文件拆分为小块,如 byte[] buffer = new byte[1024]

相关问题