加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

文件的flush()方法 强制清空缓冲区

(2017-06-19 23:53:51)
分类: java

Java开发中,有时我们会进行流的操作,所以可能会经常遇到这样一段代码

 

[java] view plain copy
  1. out.flush();  
  2. out.close();  
有时我们只是大概看懂这些,却不知道其中的原理性东西,下面就来理解一下:

 

flush()这个函数是清空的意思,用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失,为什么呢,因为,读入数据完成时不代表写入数据完成,一部分数据可能会留在缓存区中,为了理解这个问题,我们举一个例子:

比如,在农村,几乎每家都有抽水机,抽水机的作用是什么呢,就是把水井里的水抽到水缸中,这时我们就会用水管连接抽水机和水缸(水管就好比是缓冲区),当我们想把水井中的水都抽到水缸中时,我们就让抽水机工作抽水,如果我们发现水井里的水刚好抽完时,我们就会关掉抽水机的开关停止抽水,那么这时,管道里就会遗留一部分水,抽水就是读数据,水缸进水就是写数据,水管充当缓存区的角色,不知道这样是不是具象化了呢

那么这样一来我们如果中途调用close()方法,输出区也还是有数据的,就像水缸里有水,只是在缓冲区遗留了一部分,这时如果我们先调用flush()方法,就会强制把数据输出,缓存区就清空了,最后再关闭读写流调用close()就完成了。

 

[java] view plain copy
  1.  public class PrintWriter extends Writer  
  2.     protected Writer out;  
  3.   
  4.     private void ensureOpen() throws IOException  
  5.         if (out == null 
  6.             throw new IOException("Stream closed");  
  7.      
  8.   
  9.       
  10.     public void flush()  
  11.         try  
  12.             synchronized (lock)  
  13.                 ensureOpen();  
  14.                 out.flush();  
  15.              
  16.          
  17.         catch (IOException x)  
  18.             trouble true 
  19.          
  20.      
  21.   
  22.  
这是JDK中PrintWriter类提供的flush方法,如上面注释所说,ensureOpen()方法是用于确保该流没有被关闭,如果没有关闭则执行flush方法中的out.flush();

0

阅读 收藏 喜欢 打印举报/Report
前一篇:回车和换行
后一篇:java遗留问题
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有