BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
servletOutputStream = httpServletResponse.getOutputStream();
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + "results.csv");
httpServletResponse.setContentLength((int) file.length());
httpServletResponse.setContentType("application/csv");
byte[] buffer = new byte[1024];
while (input.read(buffer) > 0) {
servletOutputStream.write(buffer);
}
input.close();
servletOutputStream.close();
httpServletResponse.flushBuffer();
}
这段代码是用来jsp下载文件的。
如果我把上面对应的代码换成下面这样好像也能实现功能。
byte[] buffer = new byte[1024];
int flag = 0;
input = new FileInputStream(exportFile);
while ((flag = input.read(buffer)) > 0) {
servletOutputStream.write(buffer, 0, flag);
}
那么servletOutputStream.write(buffer, 0, flag);和servletOutputStream.write(buffer)
有什么区别呢?
还有我有个疑问,while后面写的时候,write后面没有加true,为什么没有把之前写好的给替换掉啊?
还是flush之后,再写东西的时候,需要加true,没有flush之前,不会替换之前写的东西??
这边我的理解比较含糊,哪个人搞IO比较多点的,给点好的解释啊!!!谢谢了!!!
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
servletOutputStream = httpServletResponse.getOutputStream();
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + "results.csv");
httpServletResponse.setContentLength((int) file.length());
httpServletResponse.setContentType("application/csv");
byte[] buffer = new byte[1024];
while (input.read(buffer) > 0) {
servletOutputStream.write(buffer);
}
input.close();
servletOutputStream.close();
httpServletResponse.flushBuffer();
}
这段代码是用来jsp下载文件的。
如果我把上面对应的代码换成下面这样好像也能实现功能。
byte[] buffer = new byte[1024];
int flag = 0;
input = new FileInputStream(exportFile);
while ((flag = input.read(buffer)) > 0) {
servletOutputStream.write(buffer, 0, flag);
}
那么servletOutputStream.write(buffer, 0, flag);和servletOutputStream.write(buffer)
有什么区别呢?
还有我有个疑问,while后面写的时候,write后面没有加true,为什么没有把之前写好的给替换掉啊?
还是flush之后,再写东西的时候,需要加true,没有flush之前,不会替换之前写的东西??
这边我的理解比较含糊,哪个人搞IO比较多点的,给点好的解释啊!!!谢谢了!!!
解决方案 »
- 我刚学JDCB,跟着教材也做了个程序 出现Exception in thread "main" java.lang.NullPointerException的错
- mysql 数据批量转移
- JAVA static 在web 中的作用
- 一个计时器的小程序,请教
- xform有人搞过吗?如果是你,请和我沟通,谢谢, 高分哦
- 關於封裝,請進.....
- Compile的问题
- 关于在JAVA中绘画GIF动画文件的问题!非常的奇怪!!!
- JNI调用链接错误
- 请问用dispose方法退出窗体和用System.exti(0)退出有何区别,谢谢
- 问个类的问题
- 问大家java的j2se的get、set和public、private的问题?
servletOutputStream.write(buffer, 0, flag) buffer 是向流写入的数组 0是偏移量 flag写入的长度。
servletOutputStream.write(buffer)使用的默认值 默认的偏移量是0 长度就是数组的长度,所以结果是一样的。如果改成servletOutputStream.write(buffer, 2, flag)你再看看是不是不同了。
OutputStream.write每次都把数据写入到缓存中,然后从缓存中输出,flush方法的作用就是强制清空缓存,并且把缓存中的内存输出。OutputStream.write应该没有给一个boolean的参数控制是否追加写入,你说的控制追加写入的是FileWriter吧,那个和OutputStream不同。httpServletResponse是作为响应输出给访问者的浏览器了。用户发请求request给Servlet,Servlet生成页面后通过Response把页面内容返回给访问者。
flush和httpServletResponse.flushBuffer();有什么区别啊?
flush方法是OutputStream的
flushBuffer()是httpServletResponse的 不同的类方法不同