IO流BufferedOutputStream 一定比 FileOutputStream 快嗎?

      網(wǎng)友投稿 1190 2022-05-28

      FilteOutputStream

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

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

      1

      BufferedOutputStream

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

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

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

      第①種:緩存區(qū)滿了,寫出去!

      第②種:flush()方法被調(diào)用,寫出去!

      第③種:close()方法被調(diào)用,寫出去!因?yàn)椋琧lose()方法被調(diào)用的時(shí)候,會(huì)先調(diào)用flush()方法。

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

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

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

      1

      2

      3

      4

      5

      區(qū)別

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

      BufferedOutputStream 真的比 FileOutputStream 快嗎?

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

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

      這一輪測試?yán)锩妫瑫?huì)延時(shí)5秒,在這5秒內(nèi)不停地往文件中寫入一個(gè)字節(jié)的數(shù)據(jù);我們看看5秒后BufferedOutputStream 和 FileOutputStream 能寫多少數(shù)據(jù),代碼如下,(

      注意:這2個(gè)測試方法用到了一個(gè)共享變量run,所以測試時(shí)一定要分開運(yùn)行,千萬不可以一起運(yùn)行這個(gè)2個(gè)測試方法,否則測試數(shù)據(jù)不準(zhǔn)確

      volatile boolean run = true; // 標(biāo)志位 // 不帶緩沖區(qū) 每次只寫一個(gè)字節(jié) @Test public void fileWriteOneByte() throws IOException { FileOutputStream fileOutputStream = new FileOutputStream("D:\FileOutputStream_one.txt"); // 延時(shí)5秒 fiveSeconds(); while (run){ // 每次寫一個(gè)字節(jié) fileOutputStream.write(1); } fileOutputStream.flush(); fileOutputStream.close(); } // 帶緩沖區(qū)-->每次只寫一個(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){ // 每次寫一個(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(); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

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

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

      這一次我們加大量級(jí),當(dāng)它們每次都寫入81920個(gè)字節(jié)時(shí),也就是80K,看看這2種方式在5秒內(nèi)能寫多少數(shù)據(jù),寫的速度會(huì)有什么變化呢?誰寫的更多呢?讓我們拭目以待,上代碼 (

      注意:這2個(gè)測試方法用到了一個(gè)共享變量run,所以測試時(shí)一定要分開運(yùn)行,千萬不可以一起運(yùn)行這個(gè)2個(gè)測試方法,否則測試數(shù)據(jù)不準(zhǔn)確

      volatile boolean run = true; // 每次寫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){ // 每次寫入 81920 個(gè)字節(jié) fileOutputStream.write(bytes); } fileOutputStream.flush(); fileOutputStream.close(); } // 每次寫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){ // 每次寫入 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(); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      IO流:BufferedOutputStream 一定比 FileOutputStream 快嗎?

      49

      50

      51

      52

      53

      54

      55

      56

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

      結(jié)論

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

      每次寫入的數(shù)據(jù)量小的情況下,帶緩沖區(qū)的BufferedOutputStream效率更快;

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

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

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:高可用prometheus集群方案選型分享
      下一篇:關(guān)于性能測試你可能需要知道這些東西!
      相關(guān)文章
      亚洲日韩精品无码一区二区三区| 亚洲天堂福利视频| 亚洲av午夜福利精品一区人妖| 亚洲精品国精品久久99热| 久久久久亚洲精品无码网址色欲 | 成人午夜亚洲精品无码网站 | 亚洲视频免费播放| 亚洲福利秒拍一区二区| 亚洲av永久无码精品漫画 | 亚洲精品自在在线观看| 久久久久亚洲精品无码网址| 亚洲综合久久夜AV | 久久久久亚洲AV综合波多野结衣| 国产亚洲精品AA片在线观看不加载| 亚洲无线一二三四区手机| 丁香五月亚洲综合深深爱| 中文字幕亚洲综合久久菠萝蜜| 中文字幕亚洲综合久久菠萝蜜 | 亚洲第一成年人网站| 亚洲午夜精品国产电影在线观看| 亚洲国产成人久久三区| 亚洲AV无码国产精品色| 亚洲一区AV无码少妇电影| 亚洲а∨精品天堂在线| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲国产一区二区视频网站| 亚洲中文字幕无码不卡电影| 亚洲国产精品成人精品无码区在线 | 亚洲精品中文字幕无码AV| 精品亚洲麻豆1区2区3区| 亚洲综合男人的天堂色婷婷| 亚洲福利视频一区二区三区| 国产.亚洲.欧洲在线| 亚洲国产午夜精品理论片在线播放| AV激情亚洲男人的天堂国语| 亚洲?v无码国产在丝袜线观看| 亚洲国产精品成人久久蜜臀| 亚洲综合色成在线播放| 亚洲精品国精品久久99热一| 亚洲综合国产精品| 亚洲香蕉在线观看|