一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>java源碼下載>

Java之NIO的基本概念

大小:0.2 MB 人氣: 2017-09-27 需要積分:1

  一.NIO中的幾個(gè)基礎(chǔ)概念

  在NIO中有幾個(gè)比較關(guān)鍵的概念:Channel(通道),Buffer(緩沖區(qū)),Selector(選擇器)。

  首先從Channel說(shuō)起吧,通道,顧名思義,就是通向什么的道路,為某個(gè)提供了渠道。在傳統(tǒng)IO中,我們要讀取一個(gè)文件中的內(nèi)容,通常是像下面這樣讀取的:

  publicclassTest { publicstaticvoidmain(String[] args) throws IOException { File file =newFile( “data.txt”); InputStream inputStream = newFileInputStream(file); byte[] bytes =newbyte[ 1024]; inputStream.read(bytes); inputStream.close(); } }

  這里的InputStream實(shí)際上就是為讀取文件提供一個(gè)通道的。

  因此可以將NIO 中的Channel同傳統(tǒng)IO中的Stream來(lái)類(lèi)比,但是要注意,傳統(tǒng)IO中,Stream是單向的,比如InputStream只能進(jìn)行讀取操作,OutputStream只能進(jìn)行寫(xiě)操作。而Channel是雙向的,既可用來(lái)進(jìn)行讀操作,又可用來(lái)進(jìn)行寫(xiě)操作。

  Buffer(緩沖區(qū)),是NIO中非常重要的一個(gè)東西,在NIO中所有數(shù)據(jù)的讀和寫(xiě)都離不開(kāi)Buffer。比如上面的一段代碼中,讀取的數(shù)據(jù)時(shí)放在byte數(shù)組當(dāng)中,而在NIO中,讀取的數(shù)據(jù)只能放在Buffer中。同樣地,寫(xiě)入數(shù)據(jù)也是先寫(xiě)入到Buffer中。

  下面介紹一下NIO中最核心的一個(gè)東西:Selector??梢哉f(shuō)它是NIO中最關(guān)鍵的一個(gè)部分,Selector的作用就是用來(lái)輪詢每個(gè)注冊(cè)的Channel,一旦發(fā)現(xiàn)Channel有注冊(cè)的事件發(fā)生,便獲取事件然后進(jìn)行處理。

  比如看下面的這個(gè)例子:

  Java之NIO的基本概念

  用單線程處理一個(gè)Selector,然后通過(guò)Selector.select()方法來(lái)獲取到達(dá)事件,在獲取了到達(dá)事件之后,就可以逐個(gè)地對(duì)這些事件進(jìn)行響應(yīng)處理。

  二.Channel

  在前面已經(jīng)提到,Channel和傳統(tǒng)IO中的Stream很相似。雖然很相似,但是有很大的區(qū)別,主要區(qū)別為:通道是雙向的,通過(guò)一個(gè)Channel既可以進(jìn)行讀,也可以進(jìn)行寫(xiě);而Stream只能進(jìn)行單向操作,通過(guò)一個(gè)Stream只能進(jìn)行讀或者寫(xiě);

  以下是常用的幾種通道:

  - FileChannel

  - SocketChanel

  - ServerSocketChannel

  - DatagramChannel

  通過(guò)使用FileChannel可以從文件讀或者向文件寫(xiě)入數(shù)據(jù);通過(guò)SocketChannel,以TCP來(lái)向網(wǎng)絡(luò)連接的兩端讀寫(xiě)數(shù)據(jù);通過(guò)ServerSocketChanel能夠監(jiān)聽(tīng)客戶端發(fā)起的TCP連接,并為每個(gè)TCP連接創(chuàng)建一個(gè)新的SocketChannel來(lái)進(jìn)行數(shù)據(jù)讀寫(xiě);通過(guò)DatagramChannel,以UDP協(xié)議來(lái)向網(wǎng)絡(luò)連接的兩端讀寫(xiě)數(shù)據(jù)。

  下面給出通過(guò)FileChannel來(lái)向文件中寫(xiě)入數(shù)據(jù)的一個(gè)例子:

  /** * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java! */publicclassTest{publicstaticvoidmain(String[] args) throwsIOException { File file =newFile( “data.txt”); FileOutputStream outputStream = newFileOutputStream(file); FileChannel channel = outputStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate( 1024); String string = “java nio”; buffer.put(string.getBytes()); buffer.flip(); //此處必須要調(diào)用buffer的flip方法channel.write(buffer); channel.close(); outputStream.close(); } }

  通過(guò)上面的程序會(huì)向工程目錄下的data.txt文件寫(xiě)入字符串”java nio”,注意在調(diào)用channel的write方法之前必須調(diào)用buffer的flip方法,否則無(wú)法正確寫(xiě)入內(nèi)容,至于具體原因?qū)⒃谙缕┪闹芯唧w講述Buffer的用法時(shí)闡述。

  三.Buffer

  Buffer,故名思意,緩沖區(qū),實(shí)際上是一個(gè)容器,是一個(gè)連續(xù)數(shù)組。Channel提供從文件、網(wǎng)絡(luò)讀取數(shù)據(jù)的渠道,但是讀取或?qū)懭氲臄?shù)據(jù)都必須經(jīng)由Buffer。具體看下面這張圖就理解了:

  Java之NIO的基本概念

  上面的圖描述了從一個(gè)客戶端向服務(wù)端發(fā)送數(shù)據(jù),然后服務(wù)端接收數(shù)據(jù)的過(guò)程??蛻舳税l(fā)送數(shù)據(jù)時(shí),必須先將數(shù)據(jù)存入Buffer中,然后將Buffer中的內(nèi)容寫(xiě)入通道。服務(wù)端這邊接收數(shù)據(jù)必須通過(guò)Channel將數(shù)據(jù)讀入到Buffer中,然后再?gòu)腂uffer中取出數(shù)據(jù)來(lái)處理。

  在NIO中,Buffer是一個(gè)頂層父類(lèi),它是一個(gè)抽象類(lèi),常用的Buffer的子類(lèi)有:

  - ByteBuffer

  - IntBuffer

  - CharBuffer

  - LongBuffer

  - DoubleBuffer

  - FloatBuffer

  - ShortBuffer

  如果是對(duì)于文件讀寫(xiě),上面幾種Buffer都可能會(huì)用到。但是對(duì)于網(wǎng)絡(luò)讀寫(xiě)來(lái)說(shuō),用的最多的是ByteBuffer。

  關(guān)于Buffer的具體使用以及它的limit、posiion和capacity這幾個(gè)屬性的理解在下一篇文章中講述。

  四.Selector

  Selector類(lèi)是NIO的核心類(lèi),Selector能夠檢測(cè)多個(gè)注冊(cè)的通道上是否有事件發(fā)生,如果有事件發(fā)生,便獲取事件然后針對(duì)每個(gè)事件進(jìn)行相應(yīng)的響應(yīng)處理。這樣一來(lái),只是用一個(gè)單線程就可以管理多個(gè)通道,也就是管理多個(gè)連接。這樣使得只有在連接真正有讀寫(xiě)事件發(fā)生時(shí),才會(huì)調(diào)用函數(shù)來(lái)進(jìn)行讀寫(xiě),就大大地減少了系統(tǒng)開(kāi)銷(xiāo),并且不必為每個(gè)連接都創(chuàng)建一個(gè)線程,不用去維護(hù)多個(gè)線程,并且避免了多線程之間的上下文切換導(dǎo)致的開(kāi)銷(xiāo)。

  與Selector有關(guān)的一個(gè)關(guān)鍵類(lèi)是SelectionKey,一個(gè)SelectionKey表示一個(gè)到達(dá)的事件,這2個(gè)類(lèi)構(gòu)成了服務(wù)端處理業(yè)務(wù)的關(guān)鍵邏輯。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?