1. 程式人生 > >Java NIO之 Java NIO Overview(譯)

Java NIO之 Java NIO Overview(譯)

看到一個國外的作者寫的關於java的文章還不錯,於是便翻譯過來了,再加上自己的一些理解

Java NIO主要由下面三個核心元件構成:

  • Channels(通道)
  • Buffers(緩衝)
  • Selectors(選擇器)

除了上面三個,java nio還有許多的類和元件,但是 Channel、Buffer和Selector組成了核心的API。剩下的元件,比如 Pipe和FileLock僅僅是當我們使用上面三個核心元件的時候使用到的一些幫助類(utility classes),因此在這篇NIO 概述中我主要集中談這三個元件,其他的會在本教程的其他地方進行講解。

Channels and Buffer

通常,NIO中的所有IO都以通道(Channle)開始,通道有點像流,通道里的資料可以讀取到一個緩衝(Buffer)中,同樣也可以將緩衝中的資料寫入到一個通道里去,就像下面的例子一樣:
Java NIO: Channels read data into Buffers, and Buffers write data into Channels
Java中提供了幾個不同型別的Channel和Buffer,下面列出了在Java NIO中幾個主要的Channel實現類:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

正如你看到的,上面這些Channel的實現類包含了網路IO中的UDP+TCP以及檔案IO。
伴隨著這些類,java還提供了一些有意思的介面,但為了簡單起見,暫時不講,當出現與這些介面相關的內容的時候會講解。
下面列出的是在java nio中Buffer的一些核心的實現類:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

上面這些buffer實現類包含了可以通過IO傳輸的基本資料型別:byte, short, int, long, float, double 和字元。
Java NIO中還包含一個 MappedByteBuffer 用來與記憶體對映檔案(memory mapped files)結合使用,本文中將略過。

Selectors(選擇器)

一個選擇器允許單個執行緒去處理多個通道,當你的程式打開了許多的連線,但每個連線的流量比較少(low traffic),即通訊資料量少,使用Selector很方便。比如聊天伺服器。
下面展示的例子是單個執行緒使用一個Selector處理三個Channels:
Java NIO: A Thread uses a Selector to handle 3 Channel's


為了使用Selector,首先註冊Channel到Selector上面,然後呼叫選擇器的 select()方法,這個方法會一直阻塞直到註冊的通道中的任何一個有一個事件就緒(比如 incoming connection、data received),一旦該方法返回,執行緒便可以處理這些事件。

相關推薦

Java NIO Java NIO Overview

看到一個國外的作者寫的關於java的文章還不錯,於是便翻譯過來了,再加上自己的一些理解 Java NIO主要由下面三個核心元件構成: Channels(通道) Buffers(緩衝) Selectors(選擇器) 除了上面三個,java n

java基礎多線程3閉鎖

ger 死循環 trac turn ktr adg throw boolean brush 1.閉鎖方式1:利用CountDownLatch進行閉鎖 import java.util.concurrent.CountDownLatch; public class Clo

Java重入鎖Reentrantlock原理,公平鎖與非公平鎖

一個 star spa void 模板 ont thread fin 模式 1、特點: 已獲取鎖的線程再次請求鎖,可以直接獲取。 2、實現: 自定義內部類 Sync,繼承 AbstarctQueuedSynchronizer : 2.1、獲取鎖:lock() a、公平鎖:

小白的java學習路 “ 選擇結構

測試 exti 邏輯運算符 main system 有一個 學習 並且 oid if選擇結構: if選擇結構是根據條件判斷之後再做處理的一種語法結構。 1.if選擇結構的語法: public class Demo{ public static void main(

小白的java學習路 “ 選擇結構

pre ring 問題 -s stat 適合 static 之路 span switch 選擇結構: 為什麽使用switch選擇結構: switch選擇結構可以更好地解決等值判斷問題。 switch選擇結構的四個關鍵字: switch case default

數據結構Java紅黑樹

如何 當前 鏈接 根節點 java版 -- 查找 變色 繼承   紅黑樹是一種自動平衡的二叉查找樹,因為存在紅黑規則,所以有效的防止了二叉樹退化成了鏈表,且查找和刪除的速度都很快,時間復雜度為log(n)。   什麽是紅黑規則?   1.根節點必須是黑色的。   2.節點顏

java基礎I/O流-------轉換流

一.轉換流的概念: 轉換流即包裝流,可以使位元組流轉換成字元流,也可以字元流轉成位元組流。         二.位元組流轉字元流:                    1.InputStreamReader 是位元組流通向字元流的橋樑:它使用指定的 charset

分散式Java應用集合框架篇

前言: 在分散式Java應用之集合框架篇(上)一文中,從整體上對Java分散式應用中的集合框架進行了介紹,以及對於其中的List家族給出了原始碼分析;本文將繼續介紹集合框架中的Set家族和Map家族,其實Set家族和Map家族之間是有著很深的淵源,在本文的後續內

java基礎I/O流------------字元流的檔案讀寫操作

一.流的概念: java的輸入輸出稱為流,流是一組有順序的集合。而流的本質則是資料傳輸 二.流的分類:                  1.根據處理的功能分為位元組流(InputStream,OutPutStrean)和字元流(Writer,Reader)  

Java基礎深入理解介面interface意義

在學習介面的時候,一致沒有理解透徹,再次學習時,發現要學習介面,必須要理解其運用場景。理解面向介面程式設計對理解介面非常有幫助。 首先面向介面程式設計和麵向物件程式設計並不是平級的,它並不是比面向物件程式設計更先進的一種獨立的程式設計思想,而是附屬於面向物件思想體系,屬於其

Java併發AQS原始碼分析

我在Java併發之AQS原始碼分析(一)這篇文章中,從原始碼的角度深度剖析了 AQS 獨佔鎖模式下的獲取鎖與釋放鎖的邏輯,如果你把

Java安全Commons Collections1分析

# Java安全之Commons Collections1分析(二) ## 0x00 前言 續上篇文,繼續除錯cc鏈。在上篇文章除錯的cc鏈其實並不是一個完整的鏈。只是使用了幾個方法的的互相呼叫彈出一個計算器。 [Java安全之Commons Collections1分析(一)](https://www

Java安全Commons Collections1分析

# Java安全之Commons Collections1分析(三) ## 0x00 前言 繼續來分析cc鏈,用了前面幾篇文章來鋪墊了一些知識。在上篇文章裡,其實是硬看程式碼,並沒有去除錯。因為一直找不到JDK的低版本。 全靠腦子去記傳參內容嘗試理解。後面的其實就簡單多了,在上篇文章的基礎上再去做

Java併發ThreadPoolExecutor原始碼解析

Worker 先前,筆者講解到ThreadPoolExecutor.addWorker(Runnable firstTask, boolean core),在這個方法中工作執行緒可能建立成功,也可能建立失敗,具體視執行緒池的邊界條件,以及當前記憶體情況而定。 那麼,如果執行緒池當前的狀態,是允許建立Worke

npm模組opn使用教程

原文連結 安裝 $ npm install --save opn 使用方法 const opn = require('opn'); // opens the image in the default image viewer opn(

Java NIO Overview

原文連結:http://tutorials.jenkov.com/java-nio/overview.html,如有侵權,立刪。 Java NIO Overview   Java NIO包含以下部件: Channels Buffers Selectors   Java NIO由很多類

Java NIO 必知必會Example

管道流: Java NIO 管道是2個執行緒之間的單向資料連線。Pipe有一個source通道和一個sink通道。資料會被寫到sink通道,從source通道讀取。 1 package base.nio.threaddemo; 2 3 import java.io.IOExce

Java NIOJava中的IO分類

前言  前面兩篇文章(Java NIO之理解I/O模型(一)、Java NIO之理解I/O模型(二))介紹了,IO的機制,以及幾種IO模型的內容,還有涉及到的設計模式。這次要寫一些更貼近實際一些的內容了,終於要說到了Java中的各種IO了。我也是邊學邊理解,有寫的不對的地方,歡迎小夥伴們指出和補充

Java 常用運算符3

註意 sys 有趣的 open size 除法 如果能 都是 pla 什麽是運算符: 運算符是一種“功能”符號,用以通知 Java 進行相關的運算。譬如,我們需要將變量 age 的值設置為 20 ,這時候就需要一個“=”,告

JAVA設計模式單例模式

單例對象 日誌 locking anti 常見 基本上 title 加載 懶漢式 本文繼續介紹23種設計模式系列之單例模式。 概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裏主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特