问大家关于java的IO流这边的几个问题,希望能得到你们的答案,谢谢了!

BufferedInputStreaminput=newBufferedInputStream(newFileInputStream(file));HttpServlet... 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比较多点的,给点好的解释啊!!!谢谢了!!!
展开
 我来答
llei32wang
推荐于2016-12-01 · TA获得超过2736个赞
知道大有可为答主
回答量:1478
采纳率:60%
帮助的人:1407万
展开全部
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不同。
更多追问追答
追问
还有三个问题帮忙解答一下行吗?

1.flush方法的作用就是强制清空缓存,并且把缓存中的内存输出 。
我想问一下,这个实现jsp下载,先把东西下载下来(其实没有下载下来,是放到哪里了呢),之后再servletOutputStream把东西输出到哪里呢?
2.flush和httpServletResponse.flushBuffer();有什么区别啊?
追答
httpServletResponse是作为响应输出给访问者的浏览器了。用户发请求request给Servlet,Servlet生成页面后通过Response把页面内容返回给访问者。
flush和httpServletResponse.flushBuffer();有什么区别啊?
flush方法是OutputStream的
flushBuffer()是httpServletResponse的 不同的类方法不同
wskfhvhc
2012-12-27 · TA获得超过692个赞
知道小有建树答主
回答量:307
采纳率:66%
帮助的人:302万
展开全部
servletOutputStream是继承了OutputStream类,这个类的write()写入方法,如果write(buffer);是直接将buffer中的字节值输出,write(buffer, 0, flag)是将buffer中0-flag这段长度写入,这样操作的原因是:buffer是一个长度为1024的字节数组,用来不断的接收input传入的值,最后一次接收的值不可能是刚好1024b,所以为了不将多余的空白内容用write()方法输出,使用了write(buffer, 0, flag)

另外,BufferedInputStream 是用缓冲区在与文件传输,关闭就相当于用了flush()
更多追问追答
追问
BufferedInputStream 是用缓冲区在与文件传输,但是servletOutputStream又没有缓冲,servletOutputStream能够重复写进去吗?不会把之前的内容替换掉?像FileWriter那样,必须要加个true?
追答
ServletOutputStream.write(bufer,0,flag)是用while(input.read(bffer)!=-1)作为条件,不断读取,然后向文件写入,将所有内容写入文件后,下次再操作,会将之前写入的内容替换掉,ServletOutputStream没有追加功能,如果想实现追加,直接用实例化FileOutStream(File,true) ,用这个类写入
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式