Java NIO(New IO)是用于Java(來自Java 1.4)的替代IO API乡革,意味著替代標(biāo)準(zhǔn) Java IO和Java Networking API。Java NIO提供了與標(biāo)準(zhǔn)IO API不同的IO工作方式病附。
Java NIO:Channels和Buffers
在標(biāo)準(zhǔn)IO API中,您可以使用字節(jié)流和字符流抚岗。在NIO中瞧甩,您使用通道和緩沖區(qū)。數(shù)據(jù)總是從通道讀入緩沖區(qū)灶伊,或從緩沖區(qū)寫入通道疆前。
Java NIO:非阻塞IO(Non-blocking IO)
Java NIO使您可以執(zhí)行非阻塞IO。例如聘萨,一個(gè)線程可以請(qǐng)求一個(gè)通道將數(shù)據(jù)讀入緩沖區(qū)竹椒。當(dāng)通道讀取數(shù)據(jù)到緩沖區(qū)時(shí),線程可以做其他事情米辐。一旦數(shù)據(jù)被讀入緩沖區(qū)胸完,線程就可以繼續(xù)處理它。將數(shù)據(jù)寫入通道也是如此翘贮。
Java NIO:選擇器(Selectors)
Java NIO包含“選擇器”的概念赊窥。選擇器是一個(gè)可以監(jiān)視多個(gè)通道事件的對(duì)象(如:連接打開,數(shù)據(jù)到達(dá)等)择膝。因此誓琼,一個(gè)線程可以監(jiān)視多個(gè)通道的數(shù)據(jù)。
Java NIO由以下核心組件組成:
- Channels(通道)
- Buffers(緩沖區(qū))
- Selectors(選擇)
Java NIO擁有比這些更多的類和組件肴捉,但在我看來Channel
腹侣,Buffer
它Selector
構(gòu)成了API的核心。其余的組件齿穗,像 Pipe
和FileLock
只是實(shí)用程序類與三個(gè)核心組件一起使用傲隶。因此,我將在本NIO概述中關(guān)注這三個(gè)組件窃页。
頻道和緩沖區(qū)
通常跺株,NIO中的所有IO都從Channel
開始。 Channel
有點(diǎn)像小溪脖卖,從Channel
數(shù)據(jù)可以讀取到一個(gè)Buffer
乒省。數(shù)據(jù)也可以從Buffer
寫入到Channel
中。這是一個(gè)例子:
Java NIO:通道將數(shù)據(jù)讀入緩沖區(qū)畦木,緩沖區(qū)將數(shù)據(jù)寫入通道
有幾個(gè) Channel
和 Buffer
類型袖扛。以下是Channel
Java NIO中主要實(shí)現(xiàn)的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如您所見,這些通道涵蓋UDP + TCP網(wǎng)絡(luò)IO和文件IO十籍。
這些類也有一些有趣的接口,但為了簡(jiǎn)單起見惨篱,我會(huì)將它們排除在Java NIO概述之外。在Java NIO教程的其他文章中,他們將在相關(guān)位置進(jìn)行解釋。
以下是Buffer
Java NIO 中的核心實(shí)現(xiàn)列表:
- ByteBuffer(字節(jié)緩沖區(qū))
- CharBuffer(字符緩沖區(qū))
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
這些Buffer
涵蓋了您可以通過IO發(fā)送的基本數(shù)據(jù)類型:byte,short,int酗钞,long窘奏,float,double和characters。
Java NIO也有一個(gè)MappedByteBuffer
類,它是與內(nèi)存映射文件結(jié)合使用的。盡管如此,我仍然將這一點(diǎn)從此概述中排除。
Selectors(選擇)
一個(gè)Selector
允許單線程處理多個(gè)Channel
。如果您的應(yīng)用程序有多個(gè)連接(通道)打開虐拓,但每個(gè)連接只有低流量,這很適用态兴。例如狠持,在聊天服務(wù)器中。
下面是一個(gè)使用一個(gè) Selector
來處理3 的Channel
的例子:
Java NIO:一個(gè)線程使用一個(gè)選擇器來處理3個(gè)通道
要使用你注冊(cè)在Channel
的Selector
瞻润,你可以直接調(diào) select()
方法喘垂。此方法將阻塞甜刻,直到有一個(gè)event準(zhǔn)備好已注冊(cè)的頻道之一。一旦該方法返回正勒,該線程就可以處理這些事件得院。event可理解為一些即將到來的connection,數(shù)據(jù)接收等昭齐。
Next:Java NIO Channel(二)