调用BufferedOutputStream的flush方法报错

问题描述

在调用BufferedOutputStream的flush方法时报了如下的错,没明白这是报的什么错:java.io.IOException: write beyond end of streamat java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:102)at java.util.zip.GZIPOutputStream.write(GZIPOutputStream.java:72)at com.bstek.dorado.core.GZIPEncodeFilter$GZIPServletStream.write(GZIPEncodeFilter.java:130)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)at com.fenet.insurance.mm.invoice.action.InvoiceInfoToXMLAction.invoiceExport(InvoiceInfoToXMLAction.java:115)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.bstek.dorado.view.ViewModelSupport.handleUpdate(ViewModelSupport.java:954)at com.bstek.dorado.view.rpc.UpdateDataRPCHandler.internalExecute(UpdateDataRPCHandler.java:119)at com.bstek.dorado.view.rpc.AbstractRPCHandler.execute(AbstractRPCHandler.java:119)at com.bstek.dorado.view.smartweb.v2.ViewServiceController.doRPC(ViewServiceController.java:457)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.bstek.dorado.action.Controller.doDispatch(Controller.java:220)at com.bstek.dorado.action.Controller.internalDispatch(Controller.java:174)at com.bstek.dorado.action.Controller.internalDispatch(Controller.java:138)at com.bstek.dorado.action.Controller.invokeAction(Controller.java:113)at com.bstek.dorado.action.ActionHandler.invokeAction(ActionHandler.java:140)at com.bstek.dorado.action.ActionHandler.invokeAction(ActionHandler.java:130)at com.bstek.dorado.core.DoradoServlet.doGet(DoradoServlet.java:85)at com.bstek.dorado.core.DoradoServlet.doPost(DoradoServlet.java:109)at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)at com.bstek.dorado.core.FilterHandle.internalDoFilter(FilterHandle.java:362)at com.bstek.dorado.core.FilterHandle.doAgentRPCFilter(FilterHandle.java:309)at com.bstek.dorado.core.FilterHandle.doFilter(FilterHandle.java:155)at com.bstek.dorado.core.DoradoFilter.doFilter(DoradoFilter.java:72)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)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:662)代码也贴出来吧,还请大家帮忙分析下,这个问题出在哪里:public void invoiceExport(ParameterSet parameters,ParameterSet outParameters) throws Exception {String xml = "ddddddddd";HttpServletResponse response = ContextManager.response;String fileName = "file.xml";response.reset();// 必须加,不然保存不了临时文件response.setContentType("application/x-msdownload");// 设置文件内容格式,防止浏览器自动打开BufferedOutputStream bos=null;try {// 设置文件名编码格式fileName = java.net.URLEncoder.encode(fileName, "GB2312");} catch (UnsupportedEncodingException e) {throw new RuntimeException("不支持的编码格式!!!");}// 设置下载的文件名response.addHeader("content-Disposition", "attachment;filename=" + fileName);try {// 复制流bos=new BufferedOutputStream(response.getOutputStream());bos.write(xml.getBytes());} catch (FileNotFoundException e) {e.printStackTrace();throw new RuntimeException("找不到文件!!!");} catch (IOException e) {e.printStackTrace();throw new RuntimeException("写文件错误!!!");} finally {bos.flush();bos.close();}}

解决方案

应该是你在调这个方法之前,已经有人写过一次response.getOutputStream()并关闭了而你调的reset方法没有很好的还原回response的状态,导致你再写时候这个流还是关闭的,所以报错会在flush时候发生,如果你没加bufferedoutputstream,那么就是直接在write时候发生了你可以试着在web.xml去掉com.bstek.dorado.core.GZIPEncodeFilter这个filter看看,应该可以解决这个问题如果这个是公司框架,要么找人修复这个reset的问题或者你找个更早一点的时机调你这个方法
解决方案二:
close 就会调用flush 好吧你自己用个 buffer,一部分一部分的flush呗
解决方案三:
目测是这里出现问题:bos=new BufferedOutputStream(response.getOutputStream()); bos.write(xml.getBytes()); 因为:write beyond end of streambos是写流到目标,而xml.getBytes()这个长度很短,只有"dddddd"的长度。如果把它改成这样bos=new BufferedOutputStream(response.getOutputStream()); bos.write(new byte[1000000]); 这个byte要足够大,但不能大于内存大小,1000000肯定够了,如果没报错就上面猜测成立。
解决方案四:
try {// 复制流bos=new BufferedOutputStream(response.getOutputStream());bos.write(xml.getBytes());} catch (FileNotFoundException e) {e.printStackTrace();throw new RuntimeException("找不到文件!!!");} catch (IOException e) {e.printStackTrace();throw new RuntimeException("写文件错误!!!");} finally {bos.flush();bos.close();}} 改成如下试试try {// 复制流bos=new BufferedOutputStream(response.getOutputStream());bos.write(xml.getBytes());bos.flush();} catch (FileNotFoundException e) {e.printStackTrace();throw new RuntimeException("找不到文件!!!");} catch (IOException e) {e.printStackTrace();throw new RuntimeException("写文件错误!!!");} finally {if (bos != null)bos.close();}}

时间: 2024-08-01 15:47:52

调用BufferedOutputStream的flush方法报错的相关文章

ios-在继承类中调用方法报错

问题描述 在继承类中调用方法报错 有两个类A和B.在A类中: @interface A : B 在B类中,得到如下代码: self.navigationItem.rightBarButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@""Add-button-normal""] highlightedImage:[UIImage imageNamed:@""Add-b

数据库反向生成的项目调用findByProerty方法报错

问题描述 利用数据库反向生成的项目,调用findByProerty(StringpropertyName,....)方法报错,搞了一个下午了,实在不知道怎么解决了,错误代码如下:Exceptioninthread"main"javax.ejb.EJBException:EJBException:;nestedexceptionis:<openjpa-1.1.1-SNAPSHOT-r422266:891341nonfatalusererror>org.apache.openj

stringbuilder-Java Stringbuilder调用append()方法报错

问题描述 Java Stringbuilder调用append()方法报错 报错: The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class 知道了 顺便说一句 回答问题就好好回答 不愿回答就不用回答 即使别人问的问题在弱智或者啥的 也不用嘲笑别人吧....... 解决方案 先贴代码,在贴错误,肯定是代码语法有问题并且是简单问题,这个错是编译器提示的.看

jni调用java方法报错!!!

问题描述 jni调用java方法报错!!! 12-04 11:33:08.818: A/art(23825): art/runtime/check_jni.cc:70] JNI DETECTED ERROR IN APPLICATION: calling static method java.lang.String com.library.utils.MD5Utils.md5(java.lang.String) with CallObjectMethod 12-04 11:33:08.818:

ssh整合-常见的SSH执行save方法报错,

问题描述 常见的SSH执行save方法报错, 报错:Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'driverClassName' of bean class [com.mchange.v2.c3p0.ComboPooledDataSource]: Bean property 'driverClassName' is not writable or has an inval

android中关于ProgressDialog中setProgressStyle方法报错问题

问题描述 android中关于ProgressDialog中setProgressStyle方法报错问题 我在设置进度条的时候使用setProgressStyle方法,但是报错,说是并没有这个方法,打开ProgressDialog源码也没有发现这个方法,该怎么做 解决方案 关于ResultSet.last()方法报错问题的解决Android ProgressDialog 处理方法: 解决方案二: 是不是源码没关联全?按理应该有此方法的阿

引入第三方jar,执行封装的方法报错,大神求助

问题描述 引入第三方jar,执行封装的方法报错,大神求助 2016-05-23 14:58:54.053::WARN: Nested in org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String

on estroy-Android上onDestroy方法报错

问题描述 Android上onDestroy方法报错 @Override protected void onDestroy() { System.out.println(""onDestroy AppActivity""); Intent intent = new Intent(AppActivity.this Alarmreceiver.class); intent.setAction(""arui.alarm.action"&quo

java中为什么在main方法里面写sleep方法报错

问题描述 java中为什么在main方法里面写sleep方法报错 java中为什么在main方法里面写sleep方法报错,能看到图片吗,图片里有详细代码 解决方案 import java.lang.Thread;有没有加上 解决方案二: 开发建议采用Eclipse开发工具,这样导包和异常处理就很方便了. 解决方案三: 开发建议采用Eclipse开发工具,这样导包和异常处理就很方便了. 解决方案四: java中main()方法是哪个类里面的方法?JAVA中sleep().wait().yield(