【面試官】那Java NIO為什么速度快?
- 面試官:了解過NIO嗎?
- 面試官:那NIO為什么速度快?
- 面試官:還有嗎?
- 面試官:你剛剛說輸入/輸出流是處理字節(jié)?字符流不是處理字符嗎
- 面試官:你具體介紹下Buffer
- 面試官:Channel呢?
- 面試官:知道NIO零拷貝嗎?
大家好,我是南哥。
一個Java學(xué)習(xí)與進階的領(lǐng)路人,跟著南哥我們一起Java成長。
文章目錄
- Java NIO
- 通道和緩沖器
- 非阻塞IO模型
- 字符流處理字符?
- Channel和Buffer使用
- Buffer
- Channel
- NIO零拷貝
1. Java NIO
面試官:了解過
NIO
嗎?
了解的面試官。NIO的出現(xiàn)在于提高IO
的速度,它相比傳統(tǒng)的輸入/輸出流速度更快。
NIO通過管道Channel
和緩沖器Buffer
來處理數(shù)據(jù),可以把管道當(dāng)成一個礦藏,緩沖器就是礦藏里的卡車。
程序通過管道里的緩沖器進行數(shù)據(jù)交互,而不直接處理數(shù)據(jù)。程序要么從緩沖器獲取數(shù)據(jù),要么輸入數(shù)據(jù)到緩沖器。
1.1 通道和緩沖器
面試官:那
NIO
為什么速度快?
是這樣的,NIO提供了通道和緩沖器這兩個核心對象。
(1)管道Channel
:
與傳統(tǒng)的IO
流只能只讀或只寫的單向流不同,NIO通道是雙向的,也就是說讀寫操作可以同時進行,使得數(shù)據(jù)的處理效率也更高。
(2)緩沖器Buffer
:
傳統(tǒng)的輸入/輸出流一次只處理一個字節(jié),而每一次字節(jié)讀取都是一次系統(tǒng)調(diào)用,涉及到用戶空間和內(nèi)核空間之間的上下文切換,通常來說效率不高。
而NIO
采用內(nèi)存映射文件方式來處理輸入/輸出,Channel通過map()
方法把一塊數(shù)據(jù)映射到內(nèi)存中。程序通過Buffer
進行數(shù)據(jù)交互,減少了與原始數(shù)據(jù)源的直接訪問。NIO面向塊的處理方式使得效率更高。
1.2 非阻塞IO模型
面試官:還有嗎?
有的。
傳統(tǒng)的輸入/輸出流是同步阻塞IO
模型,如果數(shù)據(jù)源沒有數(shù)據(jù)了,此時程序?qū)⑦M行阻塞。
而NIO
是I/O多路復(fù)用模型,線程可以詢問通道有沒可用的數(shù)據(jù),而不需要在沒有數(shù)據(jù)時阻塞掉線程。
1.3 字符流處理字符?
面試官:你剛剛說輸入/輸出流是處理字節(jié)?字符流不是處理字符嗎?
不是的。所有數(shù)據(jù)包括文本數(shù)據(jù)最終都是以字節(jié)形式存儲的,因為計算機底層只能理解二進制數(shù)據(jù)。
字符最終也是要轉(zhuǎn)換成字節(jié)形式,之所以可以在文本文件看到字符,是因為系統(tǒng)將底層的二進制序列轉(zhuǎn)換成了字符。
2. Channel和Buffer
使用
2.1 Buffer
面試官:你具體介紹下Buffer?
好的,Buffer里有3個關(guān)鍵變量。
- capcity:表示緩沖器
Buffer
的最大數(shù)據(jù)容量。 - position:用來指出下一個可以讀出/寫入的索引位置,也就是記錄指針的
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
??以面試官面試的形式,涵蓋了你怒懟大廠面試官、拿下大廠面試所需掌握的核心知識、面試重點! ??相信一定對你順利通關(guān)面試、拿到理想Offer有所幫助! ??花費大量精力去制作本專欄,創(chuàng)作不易,各位的支持就是我創(chuàng)作的最大動力!