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

解决方案 »

  1.   

    需要flush,如果文件还没有写完,就close掉的话,就会那样的情况,良好习惯是先flush后close
      

  2.   

    servletOutputStream.write(buffer, 0, flag);和servletOutputStream.write(buffer)本来就是一样的。
    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的 不同的类方法不同