Java什么时候需要用flush()方法

今天在学网络编程时看到大佬用flush()方法,很迷茫为啥要刷新一次java.io.BufferedOutputStream类中不是有自动触发机制吗,为啥手动flush一下?然后在网上看了一圈,直到看到下面这个照片简直醍醐灌顶。

当我们使用输出流发送数据时,当数据不能填满输出流的缓冲区时,这时,数据就会被存储在输出流的缓冲区中。如果,我们这个时候调用关闭(close)输出流,存储在输出流的缓冲区中的数据就会丢失。所以说,关闭(close)输出流时,应先刷新(flush)换冲的输出流,话句话说就是:“迫使所有缓冲的输出数据被写出到底层输出流中”。

看到这了就再看一下flush()的源码吧。

publicclass BufferedOutputStream extends FilterOutputStream
   
{  
   
     publicsynchronizedvoid flush()  throws IOException
   
     {
   
        flushBuffer();
   
        out.flush();
   
     }
   
    privatevoid flushBuffer()  throws IOException
   
    {
        if(count > 0)
   
        {
            out.write(buf, 0, count);
            count = 0;
        }
     }
}

看到这里大家明白了吧,为了防止过于频繁的写操作 所以Java提供java.io.BufferedOutputStream类 内部持有一个缓冲区 默认不直接将数据写到硬盘上 而是存到缓冲区中 直到一定条件后触发(就是调用上面的flushBuffer() ) 也可以强制通过flush()方法提前触发,其实flush()也是通过out.write()将数据写入底层输出流的。

顺便提一嘴,数据首先被写入到内部的缓冲区中,而不是直接写入到其目标。这可以提高性能,因为写入到缓冲区通常比直接写入到磁盘或网络更快。但是,如果你希望确保缓冲区中的数据被立即写入到其目标,也应该调用flush()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值