更新時間:2022-07-07 11:00:19 來源:動力節(jié)點(diǎn) 瀏覽1223次
在Java基礎(chǔ)教程中,大家會學(xué)到Java IO,Java IO(輸入/輸出)用于執(zhí)行讀寫操作。java.io 包包含輸入和輸出操作所需的所有類。而Java NIO(New IO)是從 JDK 4 引入的,用于實(shí)現(xiàn)高速 IO 操作。它是標(biāo)準(zhǔn) IO API 的替代方案。本文將討論這兩種 IO 包的區(qū)別。
在深入了解 java IO 和 Java NIO 之間的區(qū)別之前,我們需要了解一些區(qū)分這兩個 I/O 包的關(guān)鍵概念:
Java IO 是一個面向流的包,這意味著它可以一次從流中讀取一個或多個字節(jié)。它使用流在數(shù)據(jù)源/接收器和 java 程序之間傳輸數(shù)據(jù)。它是單向數(shù)據(jù)傳輸。下圖說明了一個面向流的包:
與 Java IO 不同,Java NIO 是一個面向緩沖區(qū)的包。這意味著數(shù)據(jù)被讀入緩沖區(qū),使用通道進(jìn)一步處理數(shù)據(jù)。例如,一個線程要求通道將數(shù)據(jù)讀入緩沖區(qū),當(dāng)通道同時將數(shù)據(jù)讀入緩沖區(qū)時,該線程可以進(jìn)行其他工作。一旦數(shù)據(jù)被讀入緩沖區(qū),線程就可以繼續(xù)處理它在讀操作期間留下的工作。因此,NIO 是雙向數(shù)據(jù)傳輸。下圖說明了一個面向緩沖區(qū)的包:
Java IO 是阻塞 IO。這意味著如果一個線程正在調(diào)用 read() 或 write() 操作,該線程將被阻塞,直到有一些數(shù)據(jù)要讀取或數(shù)據(jù)被完全寫入。這就是為什么它是同步IO或阻塞IO。
與 Java IO 不同,Java NIO 是非阻塞 IO。這意味著如果一個線程正在調(diào)用 read() 或 write() 操作,則該線程不會被阻塞,直到有一些數(shù)據(jù)要讀取或數(shù)據(jù)被完全寫入,而不是線程繼續(xù)執(zhí)行其他操作。這就是為什么它是異步 IO 或非阻塞 IO。
通道是實(shí)體和緩沖區(qū)之間進(jìn)行有效數(shù)據(jù)傳輸?shù)拿浇椤K洚?dāng)與數(shù)據(jù)源/接收器的開放連接的網(wǎng)關(guān)。
選擇器使用單個線程在多個 IO 通道中選擇通道。
下表說明了Java IO和Java NIO之間的區(qū)別:
Java IO | Java NIO |
---|---|
Java IO 代表 Java 輸入輸出 | Java NIO 代表 Java 新輸入輸出 |
Java IO 在 java.io 包中運(yùn)行 | Java NIO 在 java.nio 包中運(yùn)行 |
Java IO 是面向流的 | Java NIO 是面向緩沖區(qū)的 |
阻塞 IO 操作 | 非阻塞IO操作 |
頻道不可用 | 可用的頻道 |
它處理流中的數(shù)據(jù) | 它處理塊中的數(shù)據(jù) |
不包含選擇器的概念 | 包含選擇器的概念 |
以上就是關(guān)于“一文讀懂io與nio的區(qū)別”介紹,大家如果對此比較感興趣,想了解更多相關(guān)知識,不妨來關(guān)注一下動力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,細(xì)致全面,很適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家能夠有所幫助哦。
初級 202925
初級 203221
初級 202629
初級 203743