在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>java源碼下載>

Java之NIO的基本概念

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

  一.NIO中的幾個基礎概念

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

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

  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實際上就是為讀取文件提供一個通道的。

  因此可以將NIO 中的Channel同傳統IO中的Stream來類比,但是要注意,傳統IO中,Stream是單向的,比如InputStream只能進行讀取操作,OutputStream只能進行寫操作。而Channel是雙向的,既可用來進行讀操作,又可用來進行寫操作。

  Buffer(緩沖區),是NIO中非常重要的一個東西,在NIO中所有數據的讀和寫都離不開Buffer。比如上面的一段代碼中,讀取的數據時放在byte數組當中,而在NIO中,讀取的數據只能放在Buffer中。同樣地,寫入數據也是先寫入到Buffer中。

  下面介紹一下NIO中最核心的一個東西:Selector。可以說它是NIO中最關鍵的一個部分,Selector的作用就是用來輪詢每個注冊的Channel,一旦發現Channel有注冊的事件發生,便獲取事件然后進行處理。

  比如看下面的這個例子:

  Java之NIO的基本概念

  用單線程處理一個Selector,然后通過Selector.select()方法來獲取到達事件,在獲取了到達事件之后,就可以逐個地對這些事件進行響應處理。

  二.Channel

  在前面已經提到,Channel和傳統IO中的Stream很相似。雖然很相似,但是有很大的區別,主要區別為:通道是雙向的,通過一個Channel既可以進行讀,也可以進行寫;而Stream只能進行單向操作,通過一個Stream只能進行讀或者寫;

  以下是常用的幾種通道:

  - FileChannel

  - SocketChanel

  - ServerSocketChannel

  - DatagramChannel

  通過使用FileChannel可以從文件讀或者向文件寫入數據;通過SocketChannel,以TCP來向網絡連接的兩端讀寫數據;通過ServerSocketChanel能夠監聽客戶端發起的TCP連接,并為每個TCP連接創建一個新的SocketChannel來進行數據讀寫;通過DatagramChannel,以UDP協議來向網絡連接的兩端讀寫數據。

  下面給出通過FileChannel來向文件中寫入數據的一個例子:

  /** * Java學習交流QQ群:589809992 我們一起學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(); //此處必須要調用buffer的flip方法channel.write(buffer); channel.close(); outputStream.close(); } }

  通過上面的程序會向工程目錄下的data.txt文件寫入字符串”java nio”,注意在調用channel的write方法之前必須調用buffer的flip方法,否則無法正確寫入內容,至于具體原因將在下篇博文中具體講述Buffer的用法時闡述。

  三.Buffer

  Buffer,故名思意,緩沖區,實際上是一個容器,是一個連續數組。Channel提供從文件、網絡讀取數據的渠道,但是讀取或寫入的數據都必須經由Buffer。具體看下面這張圖就理解了:

  Java之NIO的基本概念

  上面的圖描述了從一個客戶端向服務端發送數據,然后服務端接收數據的過程。客戶端發送數據時,必須先將數據存入Buffer中,然后將Buffer中的內容寫入通道。服務端這邊接收數據必須通過Channel將數據讀入到Buffer中,然后再從Buffer中取出數據來處理。

  在NIO中,Buffer是一個頂層父類,它是一個抽象類,常用的Buffer的子類有:

  - ByteBuffer

  - IntBuffer

  - CharBuffer

  - LongBuffer

  - DoubleBuffer

  - FloatBuffer

  - ShortBuffer

  如果是對于文件讀寫,上面幾種Buffer都可能會用到。但是對于網絡讀寫來說,用的最多的是ByteBuffer。

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

  四.Selector

  Selector類是NIO的核心類,Selector能夠檢測多個注冊的通道上是否有事件發生,如果有事件發生,便獲取事件然后針對每個事件進行相應的響應處理。這樣一來,只是用一個單線程就可以管理多個通道,也就是管理多個連接。這樣使得只有在連接真正有讀寫事件發生時,才會調用函數來進行讀寫,就大大地減少了系統開銷,并且不必為每個連接都創建一個線程,不用去維護多個線程,并且避免了多線程之間的上下文切換導致的開銷。

  與Selector有關的一個關鍵類是SelectionKey,一個SelectionKey表示一個到達的事件,這2個類構成了服務端處理業務的關鍵邏輯。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 亚洲综合区图片小说区 | 午夜在线观看免费 | 一级毛片西西人体44rt高清 | 高清一区二区在线观看 | 手机午夜看片 | 欧美日韩一区二区三区视频在线观看 | 六月婷婷七月丁香 | 狠狠做久久深爱婷婷97动漫 | 日日噜噜夜夜狠狠tv视频免费 | 色综合久久中文字幕网 | 久久免费看 | 精品手机在线视频 | 男女视频在线观看 | 中文字幕婷婷 | 国语自产免费精品视频一区二区 | 成人羞羞视频国产 | 在线亚洲日产一区二区 | 天天好b| 1v1高h肉爽文bl | 日本特黄特色 | 男生女生靠逼视频 | 国产综合视频在线观看 | 在线高清一级欧美精品 | 四虎影院永久免费 | 欧美一卡2卡三卡4卡5卡免费观看 | 美女丝袜长腿喷水gif动态图 | 特级做a爰片毛片免费看一区 | 2018天天操天天干 | 亚1洲二区三区四区免费 | 免费永久欧美性色xo影院 | 日本成人黄色网址 | 毛片a区 | 综合网天天 | 免费可以看黄的视频 s色 | 日本www色视频成人免费网站 | 欧美成人看片一区二区三区 | 美女视频一区二区三区在线 | 拍拍拍成人免费高清视频 | 欧美成人观看免费全部完小说 | 伊人久久大香线蕉综合bd高清 | 亚洲一在线 |