0 0

调用BufferedOutputStream的flush方法报错5

在调用BufferedOutputStream的flush方法时报了如下的错,没明白这是报的什么错:
java.io.IOException: write beyond end of stream
at 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();
}
}
2013年3月18日 00:02

4个答案 按时间排序 按投票排序

0 0

采纳的答案

应该是你在调这个方法之前,已经有人写过一次response.getOutputStream()并关闭了

而你调的reset方法没有很好的还原回response的状态,导致你再写时候这个流还是关闭的,所以报错会在flush时候发生,如果你没加bufferedoutputstream,那么就是直接在write时候发生了



你可以试着在web.xml去掉com.bstek.dorado.core.GZIPEncodeFilter这个filter看看,应该可以解决这个问题

如果这个是公司框架,要么找人修复这个reset的问题或者你找个更早一点的时机调你这个方法

2013年3月18日 19:00
0 0

close 就会调用flush 好吧

你自己用个 buffer,一部分一部分的flush呗

2013年3月18日 15:44
0 0

目测是这里出现问题:

bos=new BufferedOutputStream(response.getOutputStream());
bos.write(xml.getBytes());

因为:write beyond end of stream
bos是写流到目标,而xml.getBytes()这个长度很短,只有"dddddd"的长度。

如果把它改成这样

bos=new BufferedOutputStream(response.getOutputStream());
bos.write(new byte[1000000]); 这个byte要足够大,但不能大于内存大小,1000000肯定够了,如果没报错就上面猜测成立。

2013年3月18日 12:00
0 0

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();
}
} 

2013年3月18日 10:35

相关推荐

    BufferedOutputStream 介绍_动力节点Java学院整理

    BufferedOutputStream 是缓冲输出流。它继承于FilterOutputStream。 BufferedOutputStream 的作用是为另一个输出流提供“缓冲功能”。

    BufferedOutputStream.html

    java的BufferedOutputStream,开发过程中使用字符流,效率提高。字符流很好,初学者要分清字符流和字节流

    BufferedOutputStream的用法---马克-to-win java视频

    BufferedOutputStream的用法---马克-to-win java视频 缓存输出流

    Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分别继承于FilterInputStream和FilterOutputStream,代表着缓冲区的输入输出,这里我们就来看一下Java中的BufferedInputStream与BufferedOutputStream使用示例:

    jdk api-BufferedOutputStream基础、应用、实战

    jdk api-BufferedOutputStream基础、应用、实战

    java算法,实现压缩及解压缩

    Java实现压缩与解压缩ZIP  import java.io.... bos.flush();  bos.close();  bis.close();  }  zipFile.close();  } catch (Exception e) {  e.printStackTrace();  }  }  }

    BufferedOutputStream与BufferedInputStream

    字节缓冲输出流: BufferedOutputStream (OutputStream out) public class BufferStreamDemo { public static void main(String[] args) throws IOException { //字节缓冲输出流: BufferedOutputStream ...

    Android实现下载zip压缩文件并解压的方法(附源码)

    其实在网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,所以这篇文章在此记录一下下载zip文件并直接解压的方法,直接上代码,文末有源码下载。 下载: import java.io.BufferedInputStream; ...

    IO输入输出体系.rar

    需要即时写入的时候 调用 flush()方法,手动刷新缓冲流 注意 关闭流的时候也会自动刷新缓冲流中的数据 字节流转换为字符流 InputStreamReader(System.in) 适配器模式的使用 其意图是将一个类的接口转换成客户希望...

    java中实现复制文件和文件夹

    BufferedOutputStream outBuff=new BufferedOutputStream(output); // 缓冲数组 byte[] b = new byte[1024 * 5]; int len; while ((len =inBuff.read(b)) != -1) { outBuff.write(b, 0, len); } //...

    java自学之道

    3.3 方法调用举例 4、构造函数的重载 4.1 默认字段初始化 4.2 默认构造函数 4.3 显式字段初始化 4.4 构造函数被调用后的详细执行过程 5、包 5.1 创建包 5.2 创建可复用类的步骤简要说明 5.3 包的导入 5.4 包...

    FastDFS上传下载多种API测速情况及代码。

    大小类型 传输类型 api方法 文件大小 花费时间 速率byte/ms 速率mb/s 缓存数组 次数 备注 大文件 下载 download_file(group_name, remote_filename, localFile) 1073741824(约1G) 28343ms 37883 36.12804413 无 1 ...

    Java面试题及答案-共30道.docx

    * finalize() 的性质:方法,在 Object 中进行了定义,用于在对象“消失”时,由 JVM 进行调用,用于释放对象占用的资源。 * finally 的性质:区块标志,用于 try 语句中,用于标识代码块。 八、抽象类和接口 * ...

    IO体系.java

    |--BufferedOutputStream/:输出流缓冲区。 | 应用程序可以将各个字节写入底层输出流中,而不必每个字节每次都抵用底层系统。提高了输出的效率。 |--DataOutputStream/:数据输出流允许应用程序将基本数据类型写入...

    序列化与反序列化

    序列化与反序列化 概述 序列化: 就是使用流的...参数可以传入这两个:FileOutputStream,BufferedOutputStream 关键方法: writeObject(Object obj) 将指定的对象写入文件。 使用前提: 被写入对象所属的类必须要实

    下载代码

    bos = new BufferedOutputStream(new FileOutputStream(file));; int num = -1; byte[] buffer = new byte[1024]; while (true) { num = bis.read(buffer); if (num == -1) { bos....

    java经典面试2010集锦100题(不看你后悔)

    C) 子类继承父类,如果父类中只有一个构造方法并且有参数,那么在子类的构造方法中必须先用super调用父类构造方法并传参。 D) 以上说法都不正确。 题目11:d 程序如下: class Test { private int day; public int...

    IO流各个类的使用方法

    介绍了,下面这些类的具体使用方法,非常详细,值得一看 File FileFilter RandomAccessFile 【字节流】 InputStream OutputStream FileInputStream FileOutputStream DataInputStream DataOutputStream ...

    Java30道面试题及答案

    2、finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行IO操作);3、finally{}用于标识...

    Java语言-输入输出完整版资料.ppt

    BufferedInputStream和BufferedOutputStream是InputStream和OutputStream的子类,分别用于读取和写入缓冲的数据。它们提供了一些基本的方法,如read()方法,可以读取缓冲的数据。write()方法,可以将数据写入到缓冲...

Global site tag (gtag.js) - Google Analytics