亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

帶緩沖讀寫操作,“桶”的概念在哪體現?

//帶緩沖字節流讀取

?BufferedInputStream bis=new BufferedInputStream(new FileInputStream(srcFile));
??BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));
??int c;
??while((c=bis.read())!=-1){
???bos.write(c);
???bos.flush();

//不帶緩沖的字節流讀取

FileInputStream in=new FileInputStream(srcFile);
??FileOutputStream out=new FileOutputStream(destFile);
??int c;
??while((c=in.read())!=-1){
???out.write(c);
???out.flush();
??}

//具體讀寫操作時,read()方法返回的都是讀取到的字節,write寫入的也是讀到的字節內容,為什么前者(帶緩沖)比(不帶緩沖)快?前者“桶”的概念在哪體現?盼快速回復,謝謝!

正在回答

9 回答

這個問題首先要明白,讀取和寫入的過程;

知道運行內存吧???計算機為什么要運行內存呢???其實運行內存就是一個緩沖區?。?/p>

文件的讀取和寫入操作的過程是這樣的:

(1)首先說一下批量讀取和單個字節的讀取

  1. 批量讀取是new一個對象,new一個對象就是在內存中申請一個和new的要求的大小相一致的運行內存;

  2. 單個讀取系統默認申請了一個字節的運行內存;

(2)文件的讀取和寫入

?1.先說單個字節的讀取,從原文件中讀取一個字節放入到內存中,再從內存中把一個字節大小的數據放入到目標文件中;(強調一次操作必須是直接從源文件到內存再到目標文件, 才能再次讀取下個字節)

2.再說批量讀取,同理

從原文件中讀取多個字節放入到內存中,再從內存中把多個字節大小的數據放入到目標文件中;(強調一次操作必須是直接從源文件到內存再到目標文件, 才能再次讀取下多字節)

(3)從2中我們就能理解Buffer的運行機制了,開始解釋(再強調一下運存既是緩存區)

  1. buffer的單個讀取,同理讀取既是先讀取一個字節放入內存中,在讀取一個字節中,直到讀取完整個文件,批量從緩存中放到目標文件中,可以看粗這樣節省了一次一次的從內存中到目標文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費2步,變成只花費了一步,所以buffer的性能應該是正常的一倍)

  2. buffer的批量讀取,同理讀取既是先讀取多個字節放入內存中,在讀取多個字節中,直到讀取完整個文件,批量從緩存中放到目標文件中,可以看粗這樣節省了一次一次的從內存中到目標文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費2步,變成只花費了一步,所以buffer的性能應該是正常的一倍)

    (4)總結,累死我了,以上內容純屬自己瞎想,沒有驗證,求大神驗證,告訴我答案,

    ? ? 我是渣渣,我是新手,驗證發現我說的錯了,請不要罵我,xiexie

0 回復 有任何疑惑可以回復我~
#1

怒放的生命012

一定要告訴我最后的結果呀
2016-07-01 回復 有任何疑惑可以回復我~

比如說,

現在有一個水管,水流很慢,一滴一滴的流,然后你只能一滴一滴的喝。

不過呢你有了一個杯子(BuffederInputStream)你可以讓杯子一滴一滴的接著。

什么時候不需要水了,拿起來直接喝掉。這就是緩沖區

1 回復 有任何疑惑可以回復我~

你這個比喻不夠形象哦

0 回復 有任何疑惑可以回復我~

你這個沒有定義緩存size

要是想理解概念就好辦


100000個芝麻,從A碗到B碗問題

沒buff邏輯:一個一個拿過去

buff邏輯:一把一把(10000個)抓過去

(抓過去的路上浪費了很多時間)


產生區別的原因其實很復雜。沒buff浪費時間主要是IO操作次數太多(IO操作往往是效率瓶頸)

0 回復 有任何疑惑可以回復我~
#1

許曉濤

buff是緩沖區,就是說先把一粒一粒的芝麻捏到手里,再從手里直接到碗里,緩沖區啊
2015-11-30 回復 有任何疑惑可以回復我~

559bddad00012a9005000465.jpg

559bddad000156fe05000461.jpg

懂了嗎????

0 回復 有任何疑惑可以回復我~
#1

隨便學學 提問者

你這是根據代碼結果去解釋函數功能。 //帶緩沖字節流讀取 while((c=bis.read())!=-1){ //c=bis.read(),c是讀到的字節 bos.write(c); //bos.write(c),實際操作是先讀一批字節,緩沖區滿后,再進行寫操作 bos.flush(); //緩沖區功能再代碼中沒有體現 帶緩沖區代碼理解對嗎?
2015-07-08 回復 有任何疑惑可以回復我~
#2

qq_木的three次方_0

我采用帶緩沖區的批量字節數組賦值文件,竟然比不帶緩沖區的批量字節數組效率低,這是為什么?
2015-10-08 回復 有任何疑惑可以回復我~
#3

qq_木的three次方_0

long start = System.currentTimeMillis(); FileDemo.CopyByBufferBuf(new File("E:\\java\\test.mp3"), new File("E:\\java\\dest4.mp3")); long end = System.currentTimeMillis(); System.out.print("緩沖區批量字節數組復制的時間"); System.out.println(end-start);
2015-10-08 回復 有任何疑惑可以回復我~
#4

qq_木的three次方_0

long start = System.currentTimeMillis(); FileDemo.copyfileByBuf(new File("E:\\java\\test.mp3"), new File("E:\\java\\dest1.mp3")); long end = System.currentTimeMillis(); System.out.print("字節數組批量復制的時間:"); System.out.println(end-start); }
2015-10-08 回復 有任何疑惑可以回復我~
#5

qq_木的three次方_0

緩沖區批量字節數組復制的時間31 字節數組批量復制的時間:16
2015-10-08 回復 有任何疑惑可以回復我~
查看2條回復

有圖有真相

0 回復 有任何疑惑可以回復我~

需要我的代碼嗎


0 回復 有任何疑惑可以回復我~

剛剛我自己實驗了一番,用緩沖區復制相同文件用來195毫秒,不使用緩沖區用了400毫秒左右,因為不穩定,但是都在那個范圍之間。

0 回復 有任何疑惑可以回復我~

你可以這樣試試,寫一個復制文件的代碼一個用緩沖區一個不使用緩沖區,并在開始復制是記錄時間,結束后記錄時間,看看那個快。如果不會使用java中獲取當前時間的方法的話,自己去找吧

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

帶緩沖讀寫操作,“桶”的概念在哪體現?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號