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