javanio教程
❶ java.nio的描述
定義作為數據容器的緩沖區,並提供其他 NIO 包的概述。
NIO API 的集中抽象為:
緩沖區,它們是數據容器;
字元集及其相關解碼器 和編碼器,
它們在位元組和 Unicode字元之間進行轉換;
各種類型的通道,它們表示到能夠執行 IO 操作的
實體的連接;以及選擇器 和選擇鍵,它們與
可選擇信道 一起定義了多路的、無阻塞的
I/O 設施。
java.nio 包定義了緩沖區類,這些類用於所有 NIO API。java.nio.charset包中定義了字元集API,java.nio.channels包中定義了信道和選擇器 API。每個子包都具有自己的服務提供程序介面(SPI) 子包,SPI 子包的內容可用於擴展平台的默認實現或構造替代實現。
緩沖區
描述
Buffer 位置,界限和容量;
清除,反轉,重繞和標記/重置
ByteBuffer Get/put,壓縮,查看;分配,包裝
MappedByteBuffer 映射到文件的位元組緩沖區
CharBuffer Get/put,壓縮;分配,包裝
DoubleBuffer ' '
FloatBuffer ' '
IntBuffer ' '
LongBuffer ' '
ShortBuffer ' '
ByteOrder 位元組順序的類型安全的枚舉
❷ java初學者怎麼入門
學習JAVA應該從哪一部開始很多人都很迷茫,下面是我整理的學習路線和方向一共四點。希望對你有幫助!
①【學習語言基礎】
很顯然,掌握語言基礎是第一步。如果你不了解基礎知識,那麼你就不知道自己是否做錯了或者接下來該怎麼做。當然,這並不是要求你把所有的基礎知識都記住,比如所有的 Java關鍵字、核心概念或者基本編碼技術等。
②【開始編寫一些小程序】
如果你確信自己對大多數的基礎知識和概念足夠熟悉,並且能夠以某種方式將它們聯系起來,那麼你就可以進行下一步了,你可以開始嘗試編寫一些非常基本的 Java 程序,比如列印 hello world、實現簡單的加減法,等等。
③【 使用 Java API 編寫高級程序】
當你完成了大部分的基礎程序編寫,並且掌握了基本的編程技巧之後,就可以進行下一步了。我會建議你努力學習 Java 集合和 Java IO 內部的 API。你需要熟悉這些 API 提供的各種類和介面,並利用它們來創建程序。需要注意的是,你應該查找已經存在的 API 和方法來實現功能,而不是自己實現這些邏輯。你的任務是熟悉這些 API,因此你只能夠在這些已有的 API 中尋求解決方案。
④【編寫桌面程序和 Web 應用】
通過這一步的學習,面對任何 Java 面試你都能夠信心滿滿,當你討論 Java 相關的話題時也能夠充滿自信。你需要至少編寫一個 Java 桌面或者 GUI 應用程序,比如計算器,然後再編寫一個 Web 應用程序,比如醫院管理程序。在前面的學習中,你已經掌握了最基本的 Java 知識,現在你需要去探索,然後編寫出這兩個應用程序。
重要的是,它可以幫助你養成不惜一切代價完成一項任務的好習慣。這種持之以恆的態度對你職業生涯的長遠發展是非常重要的。
最後,也是最關鍵的一點,就是要多看視頻教程,這一類的資料很多,可以自己搜索看一下,B站上面很多有關java的學習資料,我冒昧的推薦一個可以參考一下:網頁鏈接
❸ java nio 開發實例
首先了解下所謂的java nio是個什麼東西!
傳統的並發型伺服器設計是利用阻塞型網路I/O 以多線程的模式來實現的 然而由
於系統常常在進行網路讀寫時處於阻塞狀態 會大大影響系統的性能 自Java 開始引入
了NIO(新I/O) API 通過使用非阻塞型I/O 實現流暢的網路讀寫操作 為開發高性能並發
型伺服器程序提供了一個很好的解決方案 這就是java nio
首先來看下傳統的阻塞型網路 I/O的不足
Java 平台傳統的I/O 系統都是基於Byte(位元組)和Stream(數據流)的 相應的I/O 操
作都是阻塞型的 所以伺服器程序也採用阻塞型I/O 進行數據的讀 寫操作 本文以TCP
長連接模式來討論並發型伺服器的相關設計 為了實現伺服器程序的並發性要求 系統由一
個單獨的主線程來監聽用戶發起的連接請求 一直處於阻塞狀態 當有用戶連接請求到來時
程序都會啟一個新的線程來統一處理用戶數據的讀 寫操作
這種模式的優點是簡單 實用 易管理 然而缺點也是顯而易見的 由於是為每一個客
戶端分配一個線程來處理輸入 輸出數據 其線程與客戶機的比例近似為 隨著線程
數量的不斷增加 伺服器啟動了大量的並發線程 會大大加大系統對線程的管理開銷 這將
成為吞吐量瓶頸的主要原因 其次由於底層的I/O 操作採用的同步模式 I/O 操作的阻塞管
理粒度是以服務於請求的線程為單位的 有可能大量的線程會閑置 處於盲等狀態 造成I/O
資源利用率不高 影響整個系統的性能
對於並發型伺服器 系統用在阻塞型I/O 等待和線程間切換的時間遠遠多於CPU 在內
存中處理數據的時間 因此傳統的阻塞型I/O 已經成為制約系統性能的瓶頸 Java 版本
後推出的NIO 工具包 提供了非阻塞型I/O 的非同步輸入輸出機制 為提高系統的性能提供
了可實現的基礎機制
NIO 包及工作原理
針對傳統I/O 工作模式的不足 NIO 工具包提出了基於Buffer(緩沖區) Channel(通
道) Selector(選擇器)的新模式 Selector(選擇器) 可選擇的Channel(通道)和
SelectionKey(選擇鍵)配合起來使用 可以實現並發的非阻塞型I/O 能力
NIO 工具包的成員
Buffer(緩沖器)
Buffer 類是一個抽象類 它有 個子類分別對應於七種基本的數據類型 ByteBuffer
CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer 和ShortBuffer 每一個Buffer
對象相當於一個數據容器 可以把它看作內存中的一個大的數組 用來存儲和提取所有基本
類型(boolean 型除外)的數據 Buffer 類的核心是一塊內存區 可以直接對其執行與內存有關
的操作 利用操作系統特性和能力提高和改善Java 傳統I/O 的性能
Channel(通道)
Channel 被認為是NIO 工具包的一大創新點 是(Buffer)緩沖器和I/O 服務之間的通道
具有雙向性 既可以讀入也可以寫出 可以更高效的傳遞數據 我們這里主要討論
ServerSocketChannel 和SocketChannel 它們都繼承了SelectableChannel 是可選擇的通道
分別可以工作在同步和非同步兩種方式下(這里的可選擇不是指可以選擇兩種工作方式 而是
指可以有選擇的注冊自己感興趣的事件) 當通道工作在同步方式時 它的功能和編程方法
與傳統的ServerSocket Socket 對象相似 當通道工作在非同步工作方式時 進行輸入輸出處
理不必等到輸入輸出完畢才返回 並且可以將其感興趣的(如 接受操作 連接操作 讀出
操作 寫入操作)事件注冊到Selector 對象上 與Selector 對象協同工作可以更有效率的支
持和管理並發的網路套接字連接
Selector(選擇器)和SelectionKey(選擇鍵)
各類 Buffer 是數據的容器對象 各類Channel 實現在各類Buffer 與各類I/O 服務間傳輸
數據 Selector 是實現並發型非阻塞I/O 的核心 各種可選擇的通道將其感興趣的事件注冊
到Selector 對象上 Selector 在一個循環中不斷輪循監視這各些注冊在其上的Socket 通道
SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息 當Selector 監測
到在某個注冊的SelectableChannel 上發生了感興趣的事件時 自動激活產生一個SelectionKey
對象 在這個對象中記錄了哪一個SelectableChannel 上發生了哪種事件 通過對被激活的
SelectionKey 的分析 外界可以知道每個SelectableChannel 發生的具體事件類型 進行相應的
處理
NIO 工作原理
通過上面的討論 我們可以看出在並發型伺服器程序中使用NIO 實際上是通過網路事
件驅動模型實現的 我們應用Select 機制 不用為每一個客戶端連接新啟線程處理 而是將
其注冊到特定的Selector 對象上 這就可以在單線程中利用Selector 對象管理大量並發的網
絡連接 更好的利用了系統資源 採用非阻塞I/O 的通信方式 不要求阻塞等待I/O 操作完
成即可返回 從而減少了管理I/O 連接導致的系統開銷 大幅度提高了系統性能
當有讀或寫等任何注冊的事件發生時 可以從Selector 中獲得相應的
SelectionKey 從SelectionKey 中可以找到發生的事件和該事件所發生的具體的
SelectableChannel 以獲得客戶端發送過來的數據 由於在非阻塞網路I/O 中採用了事件觸
發機制 處理程序可以得到系統的主動通知 從而可以實現底層網路I/O 無阻塞 流暢地讀
寫 而不像在原來的阻塞模式下處理程序需要不斷循環等待 使用NIO 可以編寫出性能更
好 更易擴展的並發型伺服器程序
並發型伺服器程序的實現代碼
應用 NIO 工具包 基於非阻塞網路I/O 設計的並發型伺服器程序與以往基於阻塞I/O 的
實現程序有很大不同 在使用非阻塞網路I/O 的情況下 程序讀取數據和寫入數據的時機不
是由程序員控制的 而是Selector 決定的 下面便給出基於非阻塞網路I/O 的並發型伺服器
程序的核心代碼片段
import java io * //引入Java io包
import * //引入包
import java nio channels * //引入Java nio channels包
import java util * //引入Java util包
public class TestServer implements Runnable
{
/**
* 伺服器Channel對象 負責接受用戶連接
*/
private ServerSocketChannel server
/**
* Selector對象 負責監控所有的連接到伺服器的網路事件的發生
*/
private Selector selector
/**
* 總的活動連接數
*/
private int activeSockets
/**
* 伺服器Channel綁定的埠號
*/
private int port
/**
*
* 構造函數
*/
public TestServer()throws IOException
{
activeSockets=
port= //初始化伺服器Channel綁定的埠號為
selector= Selector open() //初始化Selector對象
server=ServerSocketChannel open() //初始化伺服器Channel對象
ServerSocket socket=server socket() //獲取伺服器Channel對應的//ServerSocket對象
socket bind(new InetSocketAddress(port)) //把Socket綁定到監聽埠 上
nfigureBlocking(false) //將伺服器Channel設置為非阻塞模式
server register(selector SelectionKey OP_ACCEPT) //將伺服器Channel注冊到
Selector對象 並指出伺服器Channel所感興趣的事件為可接受請求操作
}
public void run()
{
while(true)
{
try
{
/**
*應用Select機制輪循是否有用戶感興趣的新的網路事件發生 當沒有
* 新的網路事件發生時 此方法會阻塞 直到有新的網路事件發生為止
*/
selector select()
}
catch(IOException e)
{
continue //當有異常發生時 繼續進行循環操作
}
/**
* 得到活動的網路連接選擇鍵的集合
*/
Set<SelectionKey> keys=selector selectedKeys()
activeSockets=keys size() //獲取活動連接的數目
if(activeSockets== )
{
continue //如果連接數為 則繼續進行循環操作
}
/**
/**
* 應用For—Each循環遍歷整個選擇鍵集合
*/
for(SelectionKey key :keys)
{
/**
* 如果關鍵字狀態是為可接受 則接受連接 注冊通道 以接受更多的*
事件 進行相關的伺服器程序處理
*/
if(key isAcceptable())
{
doServerSocketEvent(key)
continue
}
/**
* 如果關鍵字狀態為可讀 則說明Channel是一個客戶端的連接通道
* 進行相應的讀取客戶端數據的操作
*/
if(key isReadable())
{
doClientReadEvent(key)
continue
}
/**
* 如果關鍵字狀態為可寫 則也說明Channel是一個客戶端的連接通道
* 進行相應的向客戶端寫數據的操作
*/
if(key isWritable())
{
doClinetWriteEvent(key)
continue
}
}
}
}
/**
* 處理伺服器事件操作
* @param key 伺服器選擇鍵對象
*/
private void doServerSocketEvent(SelectionKey key)
{
SocketChannel client=null
try
{
ServerSocketChannel server=(ServerSocketChannel)key channel()
client=server accept()
if(client==null)
{
return
}
nfigureBlocking(false) //將客戶端Channel設置為非阻塞型
/**
/**
* 將客戶端Channel注冊到Selector對象上 並且指出客戶端Channel所感
* 興趣的事件為可讀和可寫
*/
client register(selector SelectionKey OP_READ|SelectionKey OP_READ)
}catch(IOException e)
{
try
{
client close()
}catch(IOException e ){}
}
}
/**
* 進行向客戶端寫數據操作
* @param key 客戶端選擇鍵對象
*/
private void doClinetWriteEvent(SelectionKey key)
{
代碼實現略
}
/**
* 進行讀取客戶短數據操作
* @param key 客戶端選擇鍵對象
*/
private void doClientReadEvent(SelectionKey key)
{
代碼實現略
}
}
從上面對代碼可以看出 使用非阻塞性I/O進行並發型伺服器程序設計分三個部分
向Selector對象注冊感興趣的事件 從Selector中獲取所感興趣的事件 根據不同的事件進
行相應的處理
結語
通過使用NIO 工具包進行並發型伺服器程序設計 一個或者很少幾個Socket 線程就可
以處理成千上萬個活動的Socket 連接 大大降低了伺服器端程序的開銷 同時網路I/O 採取
非阻塞模式 線程不再在讀或寫時阻塞 操作系統可以更流暢的讀寫數據並可以更有效地向
CPU 傳遞數據進行處理 以便更有效地提高系統的性能
看到這里相信你看了不止 分鍾了吧 我說 分鍾其實就是想讓大家能夠輕松的讀下去(雞蛋 )
好了 到這里大家應該對java nio有個初步的了解了吧~~~
lishixin/Article/program/Java/hx/201311/27190
❹ 自學Java如何入門
自學Java看這一篇就夠啦!Java學習路線圖分享給你,跟著學習吧!
一、Java基礎