關(guān)于FileOutputStream,DataOutputStream,BufferedOutputStream的理解對錯
老師說:
FileOutputStream--->write方法,相當(dāng)于一滴一滴把水“轉(zhuǎn)移”過去
DataOutputStream--->writexxx(如writeInt)方法,會方便一些,相當(dāng)于一瓢一瓢“轉(zhuǎn)移”水
BufferedOutputStream--->writexxx()方法,更方便,相當(dāng)于一瓢一瓢水先放入桶(緩沖區(qū))中,然后直接把桶里水倒入缸中
我聽著反而有點怪,因為同樣是一瓢一瓢,這緩沖區(qū)不是反而還多個桶倒入缸的過程,不是更慢么?
我就自己理解成這兩個缸中間加一段距離,也就是說本來都是一滴一滴,或者一瓢一瓢,拿起水走到另一個缸旁邊把水倒進去,而緩沖區(qū)就是多了個桶,可以在這邊的缸旁邊一瓢一瓢把桶裝滿,然后提著桶過去倒水,也就是路上走的路程少了,節(jié)約的時間是從這里體現(xiàn)出來的?
2016-03-01
首先暫且不看你說的問題,我們先來說明一個關(guān)于用時的問題:
在文件的拷貝過程中,最耗時的就是IO操作,也就是取 或者存進文件的過程最耗時,(也就是從水缸中取或者放水的過程,反而運送的過程不算耗時。)
所以對于你的問題,我相信你關(guān)于一滴一滴 和一瓢一瓢你是沒有問題的,因為一瓢一瓢顯然取的次數(shù)比一滴一滴的少。你所不能理解的就是緩沖區(qū)同樣是一瓢一瓢的,而且還增加了倒入桶的過程,但是為什么還要比DataOutputStream--->writexxx(如writeInt)方法快一些,其實準(zhǔn)確來說,應(yīng)該是一次取一個緩沖區(qū)那么大小的文件,也就是一桶一桶的?。ú挥闷埃苯由贤皬母字腥∷?,裝滿緩沖區(qū)(桶)然后才運送一次。如果說你非要理解為一瓢一瓢的取也可以說得過去,那么就是我們倒入缸中的時候,是一桶一桶倒進去的。那么自然就IO次數(shù)少了。
關(guān)于用時7毫秒的批量處理,可以理解為直接把水從一個缸倒入另一個缸,因為是把所有文件寫進內(nèi)存然后再一次性寫入文件的。
希望我的回答可以幫助你。
2016-07-01
這個問題首先要明白,讀取和寫入的過程;
知道運行內(nèi)存吧???計算機為什么要運行內(nèi)存呢???其實運行內(nèi)存就是一個緩沖區(qū)??!
文件的讀取和寫入操作的過程是這樣的:
(1)首先說一下批量讀取和單個字節(jié)的讀取
批量讀取是new一個對象,new一個對象就是在內(nèi)存中申請一個和new的要求的大小相一致的運行內(nèi)存;
單個讀取系統(tǒng)默認(rèn)申請了一個字節(jié)的運行內(nèi)存;
(2)文件的讀取和寫入
?1.先說單個字節(jié)的讀取,從原文件中讀取一個字節(jié)放入到內(nèi)存中,再從內(nèi)存中把一個字節(jié)大小的數(shù)據(jù)放入到目標(biāo)文件中;(強調(diào)一次操作必須是直接從源文件到內(nèi)存再到目標(biāo)文件, 才能再次讀取下個字節(jié))
2.再說批量讀取,同理
從原文件中讀取多個字節(jié)放入到內(nèi)存中,再從內(nèi)存中把多個字節(jié)大小的數(shù)據(jù)放入到目標(biāo)文件中;(強調(diào)一次操作必須是直接從源文件到內(nèi)存再到目標(biāo)文件, 才能再次讀取下多字節(jié))
(3)從2中我們就能理解Buffer的運行機制了,開始解釋(再強調(diào)一下運存既是緩存區(qū))
buffer的單個讀取,同理讀取既是先讀取一個字節(jié)放入內(nèi)存中,在讀取一個字節(jié)中,直到讀取完整個文件,批量從緩存中放到目標(biāo)文件中,可以看粗這樣節(jié)省了一次一次的從內(nèi)存中到目標(biāo)文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費2步,變成只花費了一步,所以buffer的性能應(yīng)該是正常的一倍)
buffer的批量讀取,同理讀取既是先讀取多個字節(jié)放入內(nèi)存中,在讀取多個字節(jié)中,直到讀取完整個文件,批量從緩存中放到目標(biāo)文件中,可以看粗這樣節(jié)省了一次一次的從內(nèi)存中到目標(biāo)文件的過程即(1——》2——》3變成了1——》3,這樣從需要花費2步,變成只花費了一步,所以buffer的性能應(yīng)該是正常的一倍)
(4)總結(jié),累死我了,以上內(nèi)容純屬自己瞎想,沒有驗證,求大神驗證,告訴我答案,
? ? 我是渣渣,我是新手,驗證發(fā)現(xiàn)我說的錯了,請不要罵我,xiexie
2016-03-02
也就是說其實加上緩沖區(qū),它用的已經(jīng)不是和DataOutputStream一樣的瓢了,它相當(dāng)于用一個型號更大的東西舀水再倒。
或者假定都是瓢,系統(tǒng)耗時主要在于兩個地方:1.從缸里取水,不管是一滴還是一瓢,2.往缸里倒水,同樣不管一滴還是一瓢。DataOutputStream與BufferedOutputStream在取水過程中,耗時一樣,都是一瓢一瓢取水,但是在倒水過程中,前者還是一瓢一瓢倒水,后者則換成了一桶一桶倒水,也就是節(jié)約的時間在于倒水的過程