浅谈JAVA中流的flush()&close()方法

通过查询JAVA API.CHM帮助手册可以看到—— IO流中的每一个类都实现了Closeable接口。

而closeable接口概述如下:

该接口位于java.io包下

  • public interface Closeable
    extends AutoCloseable

    Closeable是可以关闭的数据的源或目的地。 调用close方法来释放对象持有的资源(如打开的文件)。

  •  

    IO流中的每一个类在进行资源操作之后,都需要执行close()方法将流关闭 。但字节流与字符流的不同之处在于:

    字节流是直接与数据产生交互。

    字符流在与数据交互之前要经过一个缓冲区 。 

    数据进入缓冲区的原因有两点:

    ①read()方法和write()是线程阻塞的。因而当某个线程试图向另一端网络结点进行读取/写入操作时,有可能会发生网络连接异常或者是服务器短期内没有响应,这将会导致该线程阻塞,同样,在无数据状态进行读取,数据已满进行写操作时,也会发生阻塞,这时,其他线程在抢占资源后会继续执行。如果出现上述状况,那读取到缓冲池中的数据就不能够及时的发送到另一端的网络节点,需要该线程再次竞争到CPU资源才可正常发送。

    ②数据预存到缓冲池中时,只有当数据的长度满足缓冲池中的大小后,才会将缓冲池中的数据成块的发送,若数据的长度不满足缓冲池中的大小,需要继续存入,待数据满足预存大小后再成块的发送。往往在发送文件过程中,文件末尾的数据大小不能满足缓冲池的大小。最终导致这部分的数据停留在缓冲池无法发送。

  • 综上:字符流中的数据是暂存于缓冲区的,如果不将缓冲区中的数据真正地送达"目的地",结果就可能会和自己想的不太一样。

  • 要强制将缓冲池中的数据刷出(即将缓冲区中数据送达目的地)有两种办法:
    close()方法——public abstract void close() throws IOException 
    关闭流前先刷新缓冲区中的数据,关闭后,流对象不可以再继续使用。
    flush()方法——public abstract void flush() throws IOException 
    仅仅刷新缓冲区中的数据,流对象还可以继续使用。

     

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值