我把一个文件的内容,通过流操作追加到另一个文件里,如果这个文件有1`.45M,页面就会显示如下信息:
javax.servlet.ServletException: サーブレットの実行により例外を投げました
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:220)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:595)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:432)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:954)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:138)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:595)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:432)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:954)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2459)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:132)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:595)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:593)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:593)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:432)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:954)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:126)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:595)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:432)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:954)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:534)
root cause java.lang.OutOfMemoryError请问,难道上传的文件稍微大点,就会发生这种情况??如何解决,我现在已经将FileUpload的setMaxSize设置为2*1024*1024了,难道还要设小点??

解决方案 »

  1.   

    你不要一次就把文件都读入到内存中,读一点到内存中,然后再写入到输出流中,如此循环到结束,自然不会报OutOfMemoryError
      

  2.   

    m_macInfoManager.update(fileToUpdateInfoBean.getMacInfoBean(), true,resultCount);
    boolean outputResult = m_macInfoManager.outputInfo();
    你的意思是分段循环update方法?
      

  3.   

    update方法只更新内存的,outputInfo是最后真正写文件的操作
      

  4.   

    你这个明显是先把文件全部读入到内存中嘛,
    下面给个简单的示例代码,你结合你自己的代码进行修改
    try {
    String fileName = file.getName().substring(20);// 文件名
    inputStream = new FileInputStream(file);// 打开文件;
    byte[] buffer = new byte[65535];
    OutputStream out = response.getOutputStream();
    int i;
    while ((i = inputStream.read(buffer, 0, 65535)) != -1) {
    out.write(buffer, 0, i);// 写入到下载文件流中;
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } finally {
    if (inputStream != null)
    inputStream.close();
    }
    上面这个是下载文件,其道理和你那个是一样的
    你没有必要象你那样分两步做,应该是用一个小缓存,直接操做输入流和输出流
      

  5.   

    问题是,现在后台做底层操作的人,他都是把文件的数据先全部读到内存,然后我把要更新或追加的数据给他,他那边进行更新追加判断操作,对全部数据进行更新,然后我调用outputInfo方法,他那边就把处理后的全部数据再重新写到文件里
      

  6.   

    那我现在只能设置他上传的文件大小来避免错误???问题是发现到确认画面设置成2M就可以了,但是到完了画面2M的文件都报错,1M的好象就没问题