第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

對(duì)OutputStream類的flush()方法的誤解

標(biāo)簽:
Java

在学习了《文件传输基础——Java IO流》 课程后,发现自己对flush()方法的调用有很多疑惑。在查询资料和自己看源码以及动手试验之后发现有以下几个特点。如有误也请大家指正出来,一切为了java,谢谢~

  1. FileInputStream的 flush()是继承于其父类OutputStream的,但是OutputStream类的flush()什么都没做。
  2. 当OutputStream是BufferedOutputStream时,BufferedOutputStream中重写了flush()方法,并在其中调用了flushBuffer()方法以及OutputStream的flush()方法
 public synchronized void flush() throws IOException {
        flushBuffer();
        out.flush();   //OutputStream
    }
 private void flushBuffer() throws IOException {
        if (count > 0) {
            out.write(buf, 0, count);  //OutputStream,buf是缓冲区
            count = 0;
        }
    }

3.而在BufferedOutputStream中 缓冲区buffer其实就是一个byte[],BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。

   public synchronized void write(byte b[], int off, int len) throws IOException {
        if (len >= buf.length) {
            /* If the request length exceeds the size of the output buffer,
               flush the output buffer and then write the data directly.
               In this way buffered streams will cascade harmlessly. */
            flushBuffer();
            out.write(b, off, len);
            return;
        }
        if (len > buf.length - count) {
            flushBuffer();
        }
        System.arraycopy(b, off, buf, count, len);  //写入缓冲区
        count += len;
    }

4.那么什么时候才需要调用flush()呢?
举个例子:

public static void main(String[] args) throws IOException {

        File demo = new File("demo");
        if(!demo.exists()){
            demo.mkdir();
        }
        File file = new File(demo, "raf.dat");
        if(!file.exists()){
            file.createNewFile();
        }
        PrintWriter pw = new PrintWriter(file);
        String s = "";
        for(int i = 0;i<2000;i++){
            s="我是要写入到记事本文件的内容"+i;
            pw.write(s);
        }
        pw.close();

    }

在这段代码中,加了pw.close() ,可以完整的输出到“我是要写入到记事本文件的内容1999”。而不加pw.close(),在输出“我是要写入到记事本文件的内容1804”时,输出不完整了,1804接下来的字符串也被丢弃了(这是因为1804到1999这部分没有填满缓冲区)。如果将pw.close()替换成pw.flush()也可以进行完整的输出(这只是测试,正式使用时别忘了加将pw.close())。

也就是close()时会自动flush,在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush();
(这种情况适用于字节流:BufferedOutputStream,字符流的大部分Writer类(是不是全部我没有去验证),本质上只要在某类及其父类中有定义缓冲区的都适用。)

而FileOutputStream及其父类没有缓冲区,即在使用时不需要调用flush()。

感谢 作者cmoaciopm 的博客分享(感谢是感谢,但是我不是直接copy的呀。。。我要申请原创。。。)

點(diǎn)擊查看更多內(nèi)容
5人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消