nio學習筆記
Java NIO(New IO或 Non Blocking IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java IO API。NIO支持面向緩沖區的、基於通道的IO操作。NIO將以更加高效的方式進行文件的讀寫操作。
java IO 與 java NIO 的區別
一、通道(Channel)與緩沖區(Buffer)
若需要使用 NIO 系統,需要獲取用於連接 IO 設備的通道以及用於容納數據的緩沖區。然後操作緩沖區,對數據進行處理。簡而言之,Channel 負責傳輸, Buffer 負責存儲。
1、緩沖區(Buffer)
緩沖區(Buffer) :一個用於特定基本數據類型的容器。由 java.nio 包定義的,所有緩沖區都是 Buffer 抽象類的子類。
Java NIO 中的 Buffer 主要用於與 NIO 通道進行交互,數據是從通道讀入緩沖區,從緩沖區寫入通道中的。
Buffer 的常用方法
非直接緩沖區
直接緩沖區
2、通道(Channel)
通道:由java.nio.channels包定義。
Channel表示IO源與目標打開的連接。
Channel類似於傳統的“流”。但其自身不能直接訪問數據,Channel只能與Buffer進行交互。
操作系統中:通道是一種通過執行通道程序管理I/O操作的控制器,它使主機(CPU和內存)與I/O操作之間達到更高的並行程度。需要進行I/O操作時,CPU只需啟動通道,然後可以繼續執行自身程序,通道則執行通道程序,管理與實現I/O操作。
FileChannel 的常用方法
二、NIO 的非阻塞式網絡通信
傳統的 IO 流都是阻塞式的。也就是說,當一個線程調用 read() 或 write()時,該線程被阻塞,直到有一些數據被讀取或寫入,該線程在此期間不能執行其他任務。因此,在完成網絡通信進行 IO 操作時,由於線程會阻塞,所以服務器端必須為每個客戶端都提供一個獨立的線程進行處理,當服務器端需要處理大量客戶端時,性能急劇下降。
Java NIO 是非阻塞模式的。當線程從某通道進行讀寫數據時,若沒有數據可用時,該線程可以進行其他任務。線程通常將非阻塞 IO 的空閑時間用於在其他通道上執行 IO 操作,所以單獨的線程可以管理多個輸入和輸出通道。因此,NIO 可以讓服務器端使用一個或有限幾個線程來同時處理連接到服務器端的所有客戶端。
選擇器(Selector)
選擇器(Selector) 是 SelectableChannle 對象的多路復用器,Selector 可以同時監控多個 SelectableChannel 的 IO 狀況,也就是說,利用 Selector可使一個單獨的線程管理多個 Channel。Selector 是非阻塞 IO 的核心。
SelectionKey
當調用 register(Selector sel, int ops) 將通道註冊選擇器時,選擇器對通道的監聽事件,需要通過第二個參數 ops 指定。
可以監聽的事件類型(用 可使用 SelectionKey 的四個常量 表示):
? 讀 : SelectionKey.OP_READ (1)
? 寫 : SelectionKey.OP_WRITE (4)
? 連接 : SelectionKey.OP_CONNECT (8)
? 接收 : SelectionKey.OP_ACCEPT (16)
若註冊時不止監聽一個事件,則可以使用“位或”操作符連接。
SelectionKey:表示 SelectableChannel 和 Selector 之間的註冊關系。每次向選擇器註冊通道時就會選擇一個事件(選擇鍵)。選擇鍵包含兩個表示為整數值的操作集。操作集的每一位都表示該鍵的通道所支持的一類可選擇操作。
Selector 的常用方法
DatagramChannel
Java NIO中的DatagramChannel是一個能收發UDP包的通道。
管道 (Pipe)
Java NIO 管道是2個線程之間的單向數據連接。Pipe有一個source通道和一個sink通道。數據會被寫到sink通道,從source通道讀取。
三、NIO.2 – Path 、Paths 、Files
Path 與 Paths
- java.nio.file.Path 接口代表一個平臺無關的平臺路徑,描述了目錄結構中文件的位置。
- Paths 提供的 get() 方法用來獲取 Path 對象:Path get(String first, String … more) : 用於將多個字符串串連成路徑。
- Path 常用方法:
- boolean endsWith(String path) : 判斷是否以 path 路徑結束
- boolean startsWith(String path) : 判斷是否以 path 路徑開始
- boolean isAbsolute() : 判斷是否是絕對路徑
- Path getFileName() : 返回與調用 Path 對象關聯的文件名
- Path getName(int idx) : 返回的指定索引位置 idx 的路徑名稱
- int getNameCount() : 返回Path 根目錄後面元素的數量
- Path getParent() :返回Path對象包含整個路徑,不包含Path 對象指定的文件路徑
- Path getRoot() :返回調用 Path 對象的根路徑
- Path resolve(Path p) :將相對路徑解析為絕對路徑
- Path toAbsolutePath() : 作為絕對路徑返回調用 Path 對象
- String toString() : 返回調用 Path 對象的字符串表示形式
Files 類
java.nio.file.Files 用於操作文件或目錄的工具類。
- Files常用方法:
- Path copy(Path src, Path dest, CopyOption … how) : 文件的復制
- Path createDirectory(Path path, FileAttribute< ? > … attr) : 創建一個目錄
- Path createFile(Path path, FileAttribute< ? > … arr) : 創建一個文件
- void delete(Path path) : 刪除一個文件
- Path move(Path src, Path dest, CopyOption…how) : 將 src 移動到 dest 位置
- long size(Path path) : 返回 path 指定文件的大小
-
Files常用方法:用於判斷
- boolean exists(Path path, LinkOption … opts) : 判斷文件是否存在
- boolean isDirectory(Path path, LinkOption … opts) : 判斷是否是目錄
- boolean isExecutable(Path path) : 判斷是否是可執行文件
- boolean isHidden(Path path) : 判斷是否是隱藏文件
- boolean isReadable(Path path) : 判斷文件是否可讀
- boolean isWritable(Path path) : 判斷文件是否可寫
- boolean notExists(Path path, LinkOption … opts) : 判斷文件是否不存在
- public static < A extends BasicFileAttributes> A readAttributes(Path path,Class< A > type,LinkOption…options) : 獲取與 path 指定的文件相關聯的屬性。
-
Files常用方法:用於操作內容
- SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 獲取與指定文件的連接,how 指定打開方式。
- DirectoryStream newDirectoryStream(Path path) : 打開 path 指定的目錄
- InputStream newInputStream(Path path, OpenOption…how):獲取 InputStream 對象
- OutputStream newOutputStream(Path path, OpenOption…how) : 獲取 OutputStream 對象
nio學習筆記