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比较多点的,给点好的解释啊!!!谢谢了!!!
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的 不同的类方法不同