亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比

 更新時(shí)間:2023年07月25日 09:16:07   作者:java葉新東老師  
這篇文章主要介紹了Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比,不帶緩沖的操作,每讀一個(gè)字節(jié)就要寫(xiě)入一個(gè)字節(jié),由于涉及磁盤(pán)的IO操作相比內(nèi)存的操作要慢很多,所以在讀寫(xiě)的字節(jié)比較少的情況下,效率比較低,需要的朋友可以參考下

FilteOutputStream

不帶緩沖的操作(FilteOutputStream類和FilteInputStream類),每讀一個(gè)字節(jié)就要寫(xiě)入一個(gè)字節(jié),由于涉及磁盤(pán)的IO操作相比內(nèi)存的操作要慢很多,所以在讀寫(xiě)的字節(jié)比較少的情況下,效率比較低;

FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.txt");

BufferedOutputStream

BufferedOutputStream是帶緩沖區(qū)的輸出流,不管是BufferedOutputStream還是BufferedInputStream里面都自帶了默認(rèn)緩沖區(qū),大小是8192Byte,也就是8KB ,能夠減少訪問(wèn)磁盤(pán)的次數(shù),提高文件讀取性能;它們都用到了裝飾器模式;將FilteOutputStream裝到里面,所以 BufferedOutputStream 是 依賴FilteOutputStream 的;

當(dāng)傳輸?shù)奈募貏e大的時(shí)候,BufferInputStream的優(yōu)點(diǎn)就體現(xiàn)出來(lái)了 ,帶緩沖的流,可以一次讀很多字節(jié),但不向磁盤(pán)中寫(xiě)入,只是先放到內(nèi)存里。等湊夠了緩沖區(qū)大小(默認(rèn)8KB)的時(shí)候一次性寫(xiě)入磁盤(pán),這種方式可以減少磁盤(pán)操作次數(shù),速度就會(huì)提高很多!這就是兩者的區(qū)別

BufferedOutputStream什么時(shí)候會(huì)往磁盤(pán)中寫(xiě)數(shù)據(jù)呢?

  • 第①種:緩存區(qū)滿了,寫(xiě)出去!
  • 第②種:flush()方法被調(diào)用,寫(xiě)出去!
  • 第③種:close()方法被調(diào)用,寫(xiě)出去! 

因?yàn)椋?code>close()方法被調(diào)用的時(shí)候,會(huì)先調(diào)用flush()方法。

如何設(shè)置緩沖區(qū)大小

看到了嗎?構(gòu)造方法的第二個(gè)參數(shù)就是緩沖區(qū)大小,可以自己自行配置,默認(rèn)的size就是8192,也就是8kb。

// out 寫(xiě)
BufferedOutputStream in = new BufferedOutputStream(new FileOutputStream("D:\\out.txt"),8192);
// in  讀
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:\\in.txt"),8192);

區(qū)別

通過(guò)介紹,對(duì)它們內(nèi)部的也就有了一定的了解了;

在這里插入圖片描述

BufferedOutputStream 真的比 FileOutputStream 快嗎?

為了驗(yàn)證這個(gè)這個(gè)問(wèn)題,我們需要做兩輪測(cè)試,通過(guò)寫(xiě)入少量的數(shù)據(jù)和大量數(shù)據(jù)對(duì)比一下它們之間的速度如何;

第一輪測(cè)試 :每次只寫(xiě)一個(gè)字節(jié)

這一輪測(cè)試?yán)锩?,?huì)延時(shí)5秒,在這5秒內(nèi)不停地往文件中寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù);我們看看5秒后BufferedOutputStream 和 FileOutputStream 能寫(xiě)多少數(shù)據(jù),代碼如下,(注意:這2個(gè)測(cè)試方法用到了一個(gè)共享變量run,所以測(cè)試時(shí)一定要分開(kāi)運(yùn)行,千萬(wàn)不可以一起運(yùn)行這個(gè)2個(gè)測(cè)試方法,否則測(cè)試數(shù)據(jù)不準(zhǔn)確)

    volatile boolean run = true; // 標(biāo)志位
   // 不帶緩沖區(qū) 每次只寫(xiě)一個(gè)字節(jié)
    @Test
    public void fileWriteOneByte() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\FileOutputStream_one.txt");
        // 延時(shí)5秒
        fiveSeconds();
        while (run){
            // 每次寫(xiě)一個(gè)字節(jié)
            fileOutputStream.write(1);
        }
        fileOutputStream.flush();
        fileOutputStream.close();
    }
    // 帶緩沖區(qū)-->每次只寫(xiě)一個(gè)字節(jié)
    @Test
    public void bufferWriteOneByte() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\BufferedOutputStream_one.txt");
        BufferedOutputStream bufferedInputStream = new BufferedOutputStream(fileOutputStream);
        // 延時(shí)5秒
        fiveSeconds();
        while (run){
            // 每次寫(xiě)一個(gè)字節(jié)
            bufferedInputStream.write((byte)1);
        }
        bufferedInputStream.flush();
        bufferedInputStream.close();
    }
    /**
     * 延時(shí)5秒
     */
    private void fiveSeconds(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 睡5秒
                    Thread.sleep(5000);
                    // 跳出死循環(huán)
                    run = false;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

運(yùn)行后,我們看看結(jié)果,顯而易見(jiàn),帶緩沖區(qū)的BufferedOutputStream在5秒內(nèi)寫(xiě)入了300M的數(shù)據(jù),而不帶緩沖區(qū)的FileOutputStream在5秒內(nèi)只寫(xiě)入了1.71M的數(shù)據(jù);這個(gè)讀寫(xiě)速度對(duì)比,簡(jiǎn)直就是碾壓型的;

在這里插入圖片描述

所以我宣布,第一輪 帶緩沖區(qū)的BufferedOutputStream 獲勝?。。?/p>

第二輪測(cè)試:每次寫(xiě)入81920個(gè)字節(jié)(80KB)

這一次我們加大量級(jí),當(dāng)它們每次都寫(xiě)入81920個(gè)字節(jié)時(shí),也就是80K,看看這2種方式在5秒內(nèi)能寫(xiě)多少數(shù)據(jù),寫(xiě)的速度會(huì)有什么變化呢?誰(shuí)寫(xiě)的更多呢?讓我們拭目以待,上代碼 (注意:這2個(gè)測(cè)試方法用到了一個(gè)共享變量run,所以測(cè)試時(shí)一定要分開(kāi)運(yùn)行,千萬(wàn)不可以一起運(yùn)行這個(gè)2個(gè)測(cè)試方法,否則測(cè)試數(shù)據(jù)不準(zhǔn)確)

   volatile boolean run = true;
    // 每次寫(xiě)81920個(gè)字節(jié)
    @Test
    public void file() throws IOException {
        byte[] bytes = new byte[81920];
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\FileOutputStream_81920.txt");
        // 延時(shí)5秒
        fiveSeconds();
        while (run){
            // 每次寫(xiě)入 81920 個(gè)字節(jié)
            fileOutputStream.write(bytes);
        }
        fileOutputStream.flush();
        fileOutputStream.close();
    }
    // 每次寫(xiě)81920個(gè)字節(jié)
    @Test
    public void bufferFile() throws IOException {
        byte[] bytes = new byte[81920];
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\BufferedOutputStream_81920.txt");
        BufferedOutputStream bufferedInputStream = new BufferedOutputStream(fileOutputStream,81920);
        // 延時(shí)5秒
        fiveSeconds();
        while (run){
            // 每次寫(xiě)入 81920 個(gè)字節(jié)
            bufferedInputStream.write(bytes);
        }
        bufferedInputStream.flush();
        bufferedInputStream.close();
    }
    // 延時(shí)5秒
    private void fiveSeconds(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 睡5秒
                    Thread.sleep(5000);
                    // 跳出死循環(huán)
                    run = false;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

通過(guò)結(jié)構(gòu)可以看到,帶緩沖區(qū)的BufferedOutputStream在5秒內(nèi)寫(xiě)入了將近4.5G的數(shù)據(jù),而不帶緩沖區(qū)的FileOutputStream 在5秒內(nèi)寫(xiě)入了 6.87G的數(shù)據(jù), FileOutputStream 反而更快了;

在這里插入圖片描述

所以我宣布,第二輪 不帶緩沖區(qū)的FileOutputStream 獲勝!??!

結(jié)論

通過(guò)以上的數(shù)據(jù)可以得出結(jié)論,誰(shuí)快誰(shuí)慢是根據(jù)實(shí)際情況來(lái)決定的,而不是說(shuō)帶了緩沖區(qū)就一定快;

  • 每次寫(xiě)入的數(shù)據(jù)量小的情況下,帶緩沖區(qū)的BufferedOutputStream效率更快;
  • 每次寫(xiě)入的數(shù)據(jù)量比較大時(shí),不帶緩沖區(qū)的 FileOutputStream 效率更快;

所以,大家在選擇的時(shí)候就需要根據(jù)實(shí)際情況來(lái)決定使用哪種IO流了,而大部分情況下,FileOutputStream 就已經(jīng)足夠了,只需要將寫(xiě)入的數(shù)據(jù)量大一點(diǎn)即可;

到此這篇關(guān)于Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比的文章就介紹到這了,更多相關(guān)Java的IO流BufferedOutputStream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot中RestTemplate配置HttpClient連接池詳解

    springboot中RestTemplate配置HttpClient連接池詳解

    這篇文章主要介紹了springboot中RestTemplate配置HttpClient連接池詳解,這些Http連接工具,使用起來(lái)都比較復(fù)雜,如果項(xiàng)目中使用的是Spring框架,可以使用Spring自帶的RestTemplate來(lái)進(jìn)行Http連接請(qǐng)求,需要的朋友可以參考下
    2023-11-11
  • Java利用MessageFormat實(shí)現(xiàn)短信模板的匹配

    Java利用MessageFormat實(shí)現(xiàn)短信模板的匹配

    這篇文章主要介紹了Java利用MessageFormat實(shí)現(xiàn)短信模板的匹配,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • MyEclipse安裝JS代碼提示的教程(Spket插件)

    MyEclipse安裝JS代碼提示的教程(Spket插件)

    本篇文章主要介紹了MyEclipse安裝JS代碼提示的教程(Spket插件),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • java非法字符‘\ufeff‘解決方法

    java非法字符‘\ufeff‘解決方法

    本文主要介紹了java非法字符‘\ufeff‘解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • springboot中報(bào)錯(cuò)Invalid character found in the request的解決

    springboot中報(bào)錯(cuò)Invalid character found in 

    這篇文章主要介紹了springboot中報(bào)錯(cuò)Invalid character found in the request的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java中增強(qiáng)for循環(huán)的實(shí)現(xiàn)原理和坑詳解

    Java中增強(qiáng)for循環(huán)的實(shí)現(xiàn)原理和坑詳解

    增強(qiáng)的for循環(huán)是在傳統(tǒng)的for循環(huán)中增加的強(qiáng)大的迭代功能的循環(huán),是在jdk1.5之后提出來(lái)的。下面這篇文章主要給大家介紹了關(guān)于Java中增強(qiáng)for循環(huán)的實(shí)現(xiàn)原理和坑的相關(guān)資料,需要的朋友可以參考下
    2018-04-04
  • Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略

    Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略

    在工作中,很多高并發(fā)的場(chǎng)景中,我們會(huì)用到隊(duì)列來(lái)實(shí)現(xiàn)大量的任務(wù)請(qǐng)求。當(dāng)任務(wù)需要某些特殊資源的時(shí)候,我們還需要合理的分配資源,讓隊(duì)列中的任務(wù)高效且有序完成任務(wù)。本文將為大家介紹通過(guò)java實(shí)現(xiàn)FIFO任務(wù)調(diào)度,需要的可以參考一下
    2021-12-12
  • SpringMVC路徑匹配中使用通配符問(wèn)題

    SpringMVC路徑匹配中使用通配符問(wèn)題

    這篇文章主要介紹了SpringMVC路徑匹配中使用通配符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java中全排列的生成算法匯總

    java中全排列的生成算法匯總

    本文給大家匯總介紹了常見(jiàn)的6種全排列的生成算法,包括字典序法、遞增進(jìn)位數(shù)制法、遞減進(jìn)位數(shù)制法、鄰位交換法、遞歸類算法、元素增值法,有需要的小伙伴可以參考下
    2015-07-07
  • Java基礎(chǔ)之不簡(jiǎn)單的數(shù)組

    Java基礎(chǔ)之不簡(jiǎn)單的數(shù)組

    數(shù)組(Array)是有序的元素序列。 若將有限個(gè)類型相同的變量的集合命名,那么這個(gè)名稱為數(shù)組名。組成數(shù)組的各個(gè)變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時(shí)也稱為下標(biāo)變量
    2021-09-09

最新評(píng)論