-
调用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个答案 按时间排序 按投票排序
-
采纳的答案
应该是你在调这个方法之前,已经有人写过一次response.getOutputStream()并关闭了
而你调的reset方法没有很好的还原回response的状态,导致你再写时候这个流还是关闭的,所以报错会在flush时候发生,如果你没加bufferedoutputstream,那么就是直接在write时候发生了
你可以试着在web.xml去掉com.bstek.dorado.core.GZIPEncodeFilter这个filter看看,应该可以解决这个问题
如果这个是公司框架,要么找人修复这个reset的问题或者你找个更早一点的时机调你这个方法2013年3月18日 19:00
-
目测是这里出现问题:
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
-
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 是缓冲输出流。它继承于FilterOutputStream。 BufferedOutputStream 的作用是为另一个输出流提供“缓冲功能”。
它同样维护了一个内部缓冲区,允许一次写入多个字节,直到缓冲区满或用户调用`flush()`方法。这可以减少对磁盘的写入次数,提高效率。创建BufferedOutputStream时,需要传入一个OutputStream实例,例如...
这是因为 `BufferedOutputStream` 没有实现 close() 方法,而是直接调用了 `FilterOutputStream` 的 close() 方法,后者将调用 flush 操作。 实际开发中的应用 在实际开发中,关于 IO 操作的,都强调最后要调用 ...
java的BufferedOutputStream,开发过程中使用字符流,效率提高。字符流很好,初学者要分清字符流和字节流
BufferedOutputStream的用法---马克-to-win java视频 缓存输出流
只有当缓冲区满或者我们调用 `flush()` 方法时,数据才会被一次性写入底层流,从而提高了写入的效率。 在提供的代码示例中: ```java FileOutputStream fos = new FileOutputStream("demo.txt"); ...
接下来,我们需要一个`FileOutputStream`来写入`Bitmap`,可以使用`BufferedOutputStream`提高效率并避免内存溢出。在写入过程中,通常会先将`Bitmap`转换为`ByteArrayOutputStream`,然后再写入文件。 最后,不要...
BufferedOutputStream(`obaos1`)也有一个内部缓冲区,所以它会将字节存储在其缓冲区内,直到缓冲区填满或者调用 `flush()` 方法时才会真正写入到 `baos1`。 3. **效率提升**:这种缓冲机制减少了对磁盘的直接读写...
综上所述,"大文件分片合并上传 feign调用"是Java开发中解决大文件传输问题的一种有效方法,它结合了分片、Feign调用和文件合并技术,既提高了系统性能,又降低了内存消耗,确保了大文件传输的可靠性和效率。...
- 使用`BufferedOutputStream`时,通常需要显式调用`flush()`方法确保所有数据都被写出到实际设备。 - 当关闭流时,会自动调用`flush()`方法。 **示例**: ```java BufferedOutputStream bos = new ...
`BufferedOutputStream`的`write()`方法可以接受单个字节或字节数组,并将它们写入缓冲区,直到缓冲区满或者调用`flush()`方法时才真正写入文件。 在题目中,有三个练习: - 练习一展示了如何使用`...
jdk api-BufferedOutputStream基础、应用、实战
在源码阅读过程中,我们需要注意FilterOutputStream如何通过`checkWrite()`方法来检查是否可以进行写入操作,以及如何通过`flushBuffer()`方法来刷新内部缓冲区(如果有的话)。这些细节对于理解流的工作机制至关...
bos.flush(); bos.close(); bis.close(); } ``` 5. **关闭ZipFile对象**: ```java zipFile.close(); ``` #### 三、总结 以上介绍了如何使用Java实现文件的压缩和解压缩功能。通过`java.util.zip`包提供的...
首先创建FileWriter实例,然后调用`write()`方法写入字符串,最后调用`flush()`和`close()`方法确保数据写入并释放资源。 - 清单2展示了使用FileReader读取文件内容并打印。创建FileReader实例,通过循环调用`read...
3. 调用`BufferedOutputStream`的`write(int byte)`方法写入一个字节。 4. 关闭流以释放资源。 练习二展示了如何用`BufferedOutputStream`写出一个字节数组,也就是字符串转换成字节后的形式。步骤与练习一类似,...
在这个例子中,数据首先被写入`BufferedOutputStream`,然后在适当的时候(如缓冲区满或者调用`flush()`方法)写入底层的`FileOutputStream`。 在读取数据时,`BufferedInputStream`同样增强了`FileInputStream`的...
- OutputStream的write()方法用于写入单个字节,flush()方法刷新缓冲区,将数据写出,close()方法关闭流。 5. 实际操作示例: - 读取文件:使用FileInputStream,通过循环调用read()方法,逐字节读取文件内容,...
此外,对于某些流,如带有缓冲的流,需要在关闭之前调用flush()方法,确保所有缓存的数据都被写入到目的地。 总结来说,Java的流机制是其I/O操作的核心,通过流可以实现文件读写、网络通信等多种功能。字节流适合...