帶緩沖讀寫操作,“桶”的概念在哪體現?
//帶緩沖字節流讀取
?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寫入的也是讀到的字節內容,為什么前者(帶緩沖)比(不帶緩沖)快?前者“桶”的概念在哪體現?盼快速回復,謝謝!
2016-07-01
這個問題首先要明白,讀取和寫入的過程;
知道運行內存吧???計算機為什么要運行內存呢???其實運行內存就是一個緩沖區?。?/p>
文件的讀取和寫入操作的過程是這樣的:
(1)首先說一下批量讀取和單個字節的讀取
批量讀取是new一個對象,new一個對象就是在內存中申請一個和new的要求的大小相一致的運行內存;
單個讀取系統默認申請了一個字節的運行內存;
(2)文件的讀取和寫入
?1.先說單個字節的讀取,從原文件中讀取一個字節放入到內存中,再從內存中把一個字節大小的數據放入到目標文件中;(強調一次操作必須是直接從源文件到內存再到目標文件, 才能再次讀取下個字節)
2.再說批量讀取,同理
從原文件中讀取多個字節放入到內存中,再從內存中把多個字節大小的數據放入到目標文件中;(強調一次操作必須是直接從源文件到內存再到目標文件, 才能再次讀取下多字節)
(3)從2中我們就能理解Buffer的運行機制了,開始解釋(再強調一下運存既是緩存區)
buffer的單個讀取,同理讀取既是先讀取一個字節放入內存中,在讀取一個字節中,直到讀取完整個文件,批量從緩存中放到目標文件中,可以看粗這樣節省了一次一次的從內存中到目標文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費2步,變成只花費了一步,所以buffer的性能應該是正常的一倍)
buffer的批量讀取,同理讀取既是先讀取多個字節放入內存中,在讀取多個字節中,直到讀取完整個文件,批量從緩存中放到目標文件中,可以看粗這樣節省了一次一次的從內存中到目標文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費2步,變成只花費了一步,所以buffer的性能應該是正常的一倍)
(4)總結,累死我了,以上內容純屬自己瞎想,沒有驗證,求大神驗證,告訴我答案,
? ? 我是渣渣,我是新手,驗證發現我說的錯了,請不要罵我,xiexie
2015-07-08
比如說,
現在有一個水管,水流很慢,一滴一滴的流,然后你只能一滴一滴的喝。
不過呢你有了一個杯子(BuffederInputStream)你可以讓杯子一滴一滴的接著。
什么時候不需要水了,拿起來直接喝掉。這就是緩沖區
2015-07-08
你這個比喻不夠形象哦
2015-07-08
你這個沒有定義緩存size
要是想理解概念就好辦
100000個芝麻,從A碗到B碗問題
沒buff邏輯:一個一個拿過去
buff邏輯:一把一把(10000個)抓過去
(抓過去的路上浪費了很多時間)
產生區別的原因其實很復雜。沒buff浪費時間主要是IO操作次數太多(IO操作往往是效率瓶頸)
2015-07-07
懂了嗎????
2015-07-07
有圖有真相
2015-07-07
需要我的代碼嗎
2015-07-07
剛剛我自己實驗了一番,用緩沖區復制相同文件用來195毫秒,不使用緩沖區用了400毫秒左右,因為不穩定,但是都在那個范圍之間。
2015-07-07
你可以這樣試試,寫一個復制文件的代碼一個用緩沖區一個不使用緩沖區,并在開始復制是記錄時間,結束后記錄時間,看看那個快。如果不會使用java中獲取當前時間的方法的話,自己去找吧