Java中NIO和BIO文件讀寫(xiě)的效率和選擇問(wèn)題
請(qǐng)說(shuō)一下Java中NIO與BIO的區(qū)別,并描述一下如何通過(guò)NIO進(jìn)行一個(gè)圖片的讀寫(xiě)
第一個(gè)問(wèn)題的話,在網(wǎng)絡(luò)很容易就可以得到答案了,所以在這里就不進(jìn)行回答了。
側(cè)重放到第二個(gè)問(wèn)題上來(lái),這個(gè)問(wèn)題在當(dāng)時(shí)問(wèn)到的時(shí)候第一時(shí)間沒(méi)有反應(yīng)過(guò)來(lái)。因?yàn)橹詴?huì)問(wèn)這個(gè)問(wèn)題是在簡(jiǎn)歷上寫(xiě)了Netty相關(guān)的技術(shù),在Netty中主要應(yīng)用的就是NIO實(shí)現(xiàn)高效的網(wǎng)絡(luò)IO。所以對(duì)于文件的NIO沒(méi)有印象了,也沒(méi)有g(shù)et到面試官問(wèn)這個(gè)的點(diǎn)是啥。
對(duì)于NIO而言,有幾個(gè)關(guān)鍵的組件:
Channel
ByteBuff
Channel是一個(gè)比Stream更加底層的組件。對(duì)于操作系統(tǒng)的IO而言,當(dāng)用戶應(yīng)用程序需要實(shí)現(xiàn)IO的時(shí)候,一般來(lái)說(shuō)需要操作系統(tǒng)先將磁盤(pán)內(nèi)容寫(xiě)入到系統(tǒng)內(nèi)存中,然后是由系統(tǒng)內(nèi)存寫(xiě)入到用戶內(nèi)存,此時(shí)這個(gè)數(shù)據(jù)才能由應(yīng)用程序完全控制。
首先先展示一下BIO和NIO兩種不同的文件讀寫(xiě)方式:
NIO :29145ms
BIO :29058ms
可以看到幾乎沒(méi)有差距,其實(shí)這個(gè)是完全意料之中的。因?yàn)镹IO的優(yōu)勢(shì)不在于傳輸效率,而是能夠利用IO過(guò)程中一些等待的時(shí)間。在文件傳輸?shù)臅r(shí)候,在讀寫(xiě)過(guò)程中,線程是基本一直在工作的。
也就是說(shuō):FileChannel是完全工作在阻塞模式下的
至于如何實(shí)現(xiàn)更高效的傳輸,需要用到channel的一個(gè)transfer方法
21531ms,可以看到效率還是由比較明顯的提升的,這個(gè)主要還是歸功于類似于0拷貝的思想(關(guān)于0拷貝的內(nèi)容網(wǎng)上同樣可以找到大量資料,此處也不做描述了)。如果要做文件的傳輸?shù)脑捒隙ㄊ沁x擇這個(gè)方法更好,但是之前確實(shí)沒(méi)有見(jiàn)到過(guò)相關(guān)的內(nèi)容,所以這個(gè)面試回答也沒(méi)有答上來(lái)了。
這篇文章主要還是回憶回憶NIO的東西,畢竟感覺(jué)在文件讀寫(xiě)上這方面的還是運(yùn)用的比較少,然后順便測(cè)試一下做個(gè)記錄。