李文軒 2019-04-16
聲明:這是本人學(xué)習(xí)極客時(shí)間的Java核心36講的筆記,有侵權(quán)請(qǐng)聯(lián)系我。
IO截珍、NIO、NIO 2(AIO)
-
java.io
包啄糙,基于流模型視線笛臣。交互方式為同步阻塞的方式;在讀取輸入或?qū)懭胼敵隽鲿r(shí)隧饼,完成前沈堡,線程會(huì)一直阻塞,它們之間的調(diào)用是可靠性的線性順序燕雁。- 優(yōu)點(diǎn):直觀诞丽,簡單
- 缺點(diǎn):IO效率和擴(kuò)展局限性
-
jave.nio
包,可構(gòu)建多路用且同步非阻塞的IO程序拐格;提供了接近系統(tǒng)底層的高性能數(shù)據(jù)操作方式僧免。 -
Asynchronous IO
,異步非阻塞捏浊。異步IO操作基于事件和回調(diào)機(jī)制懂衩,應(yīng)用操作直接返回,不會(huì)阻塞。
同步和異步
- 同步:可靠的有序運(yùn)行機(jī)制浊洞,當(dāng)進(jìn)行同步操作時(shí)牵敷,后續(xù)任務(wù)時(shí)等待當(dāng)前調(diào)用返回,才會(huì)進(jìn)行下一步法希。
- 異步:其他任務(wù)不需要等待當(dāng)前調(diào)用當(dāng)返回枷餐,通常依靠事件和回調(diào)等機(jī)制來實(shí)現(xiàn)任務(wù)次序關(guān)系。
阻塞與非阻塞
阻塞:在阻塞操作中苫亦,當(dāng)前線程會(huì)處于阻塞狀態(tài)毛肋,無法進(jìn)行其他任務(wù),當(dāng)條件就緒才能繼續(xù)(像讀取或者寫入操作完成)
非阻塞:不管IO操作是否結(jié)束屋剑,直接返回润匙,相應(yīng)當(dāng)操作將在后臺(tái)繼續(xù)處理。
同步或阻塞不一定就是低效的唉匾,按使用場景做分析
IO 的知識(shí)點(diǎn)
IO不僅是對(duì)文件的操作趁桃,還是在網(wǎng)絡(luò)編程中的IO操作
輸入輸出流(
InputStream/OutputStream
)用于讀取或?qū)懭胱止?jié),例如操作圖片文件Reader/Writer
用于操作字符肄鸽,增加了字符編解碼等功能。BufferedOutputStream
等帶緩沖區(qū)的實(shí)現(xiàn)油啤,可以避免頻繁的磁盤讀寫典徘,提好IO處理效率-
很多IO工具都實(shí)現(xiàn)了
Cloneable
接口,目的是進(jìn)行資源的釋放益咬;需要利用try-with-resource
/try-finally
等保護(hù)機(jī)制保證IO工具明確關(guān)閉逮诲。
Java NIO
主要組成部分:
- Buffer,高效的數(shù)據(jù)容器幽告,除了
Boolean
所有原始數(shù)據(jù)類型都有相應(yīng)的 Buffer 實(shí)現(xiàn)梅鹦。 - Channel,類似在操作系統(tǒng)上看到的文件描述符冗锁,是被用來支持批量式生產(chǎn) IO 操作的一種抽象齐唆。
- Selector,NIO 多路復(fù)用的基礎(chǔ)冻河。它可以檢測到注冊在 Selector 上多個(gè) Channel 中箍邮,是否有 Channel處于就緒狀態(tài)。也實(shí)現(xiàn)了單線程對(duì)多 Channel 的高效管理叨叙。
- Chartset锭弊,提供 Unicode 字符串定義,NIO也提供了相應(yīng)的編解碼器等擂错。
NIO和多路復(fù)用的目的:
- Java中的線程是重量級(jí)的味滞,啟動(dòng)或者銷毀一個(gè)線程是有明顯開銷的。
- 每個(gè)線程都有單獨(dú)的線程棧等結(jié)構(gòu),需要占用的內(nèi)存較多剑鞍。