java8 nio_Java8之 NIO的学习
一、什么是NIO?
Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java IO API。NIO與原來的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支持面向緩沖區的、基于通道的IO操作。NIO將以更加高效的方式進行文件的讀寫操作。
二、Java NIO 與 IO 的主要區別
IO
NIO
面向流(Steam Oriented)
面向緩沖區(Buffer Oriented)
阻塞IO(Blocking IO)
非阻塞IO(Non Blocking IO)
(無)
選擇器(Selector)
三、緩沖區(Buffer)和通道(Channel)
1、Buffer緩沖區:
Buffer 就像一個數組,可以保存多個相同類型的數據。根據數據類型不同(boolean 除外) ,有以下 Buffer 常用子類:
? ByteBuffer
? CharBuffer
? ShortBuffer
? IntBuffer
? LongBuffer
? FloatBuffer
? DoubleBuffer
上述 Buffer 類 他們都采用相似的方法進行管理數據,只是各自管理的數據類型不同而已。都是通過如下方法獲取一個 Buffer對象:static XxxBuffer allocate(int capacity) : 創建一個容量為 capacity 的 XxxBuffer 對象
緩沖區中的四個屬性:
capacity:容量,表示緩沖區中最大存儲數據的容量。一旦聲明不能改變。
limit:界限,表示緩沖區中可以操作數據的大小。(limit 后數據不能進行讀寫)。
position:位置,下一個要讀取或寫入的數據的索引。緩沖區的位置不能為負,并且不能大于其限制表示緩沖區中正在操作數據的位置。
標記 (mark)與重置 (reset):標記是一個索引,指定 Buffer 中一個當前的 position位置,之后可以通過調用 reset() 方法恢復到這個 position位置.
0 <= mark <= position <= limit <= capacity
Buffer中的常用的properties:
put()
想緩沖區中寫入數據
Buffer flip()
將緩沖區的界限設置為當前位置(position),并將當前位置(position)賦值為 0
Buffer get()
切換至讀模式之后,獲取數據
Buffer clear()
清空緩沖區并返回對緩沖區的引用,緩沖區中的數據依然存在只是處于”被遺忘“狀態
Buffer mark()
對緩沖區設置標記
Buffer position(int n)
將設置緩沖區的當前位置為 n , 并返回修改后的 Buffer 對象
Buffer limit(int n)
將設置緩沖區界限為 n, 并返回一個具有新 limit 的緩沖區對象
boolean hasRemaining()
判斷緩沖區中是否還有元素
int limit()
返回 Buffer 的界限(limit) 的位置
int capacity()
返回 Buffer 的 capacity 大小
int position()
返回緩沖區的當前位置 position
int remaining()
返回 position 和 limit 之間的元素個數
Buffer reset()
將位置 position 轉到以前設置的 mark 所在的位置
Buffer rewind()
將位置設為為 0, 取消設置的 mark
Buffer中的數據操作,get()與put()方法:
獲取 Buffer 中的數據:
get() :讀取單個字節
get(byte[] dst):批量讀取多個字節到 dst 中
get(int index):讀取指定索引位置的字節(不會移動 position)
放入數據到 Buffer 中:
put(byte b):將給定單個字節寫入緩沖區的當前位置
put(byte[] src):將 src 中的字節寫入緩沖區的當前位置
put(int index, byte b):將指定字節寫入緩沖區的索引位置(不會移動 position)
直接緩沖區與非直接緩沖區:
? 直接緩沖區:通過allocate()方法分配緩沖區,將緩沖區建立在JVM 的內存中。
? 非直接緩沖區:通過allocateDirect()方法分配直接緩沖區,將緩沖區建立在物理內存中,可以提高效率。
2、通道(Channel)
四、文件通道(FileChannel)
通道(Channel):由 java.nio.channels 包定義 的。Channel 表示 IO 源與目標打開的連接。 Channel 類似于傳統的“流”。只不過 Channel 本身不能直接訪問數據,Channel 只能與 Buffer 進行交互。
FileChannel
---- 用于讀取、寫入、映射和操作文件的通道
直接字節緩沖區可以通過調用此類的 allocateDirect() 工廠方法來創建。此方法返回的緩沖區進行分配和取消 分配所需成本通常高于非直接緩沖區。直接緩沖區的內容可以駐留在常規的垃圾回收堆之外,因此,它們對 應用程序的內存需求量造成的影響可能并不明顯。所以,建議將直接緩沖區主要分配給那些易受基礎系統的 本機 I/O 操作影響的大型、持久的緩沖區。一般情況下,最好僅在直接緩沖區能在程序性能方面帶來明顯好 處時分配它們。
直接字節緩沖區還可以通過 FileChannel 的 map() 方法 將文件區域直接映射到內存中來創建。該方法返回 MappedByteBuffer 。Java 平臺的實現有助于通過 JNI 從本機代碼創建直接字節緩沖區。如果以上這些緩沖區 中的某個緩沖區實例指的是不可訪問的內存區域,則試圖訪問該區域不會更改該緩沖區的內容,并且將會在 訪問期間或稍后的某個時間導致拋出不確定的異常。
SocketChannel
---- 通過 TCP 讀寫網絡中的數據。
ServerSocketChannel
---- 可以監聽新進來的 TCP 連接,對每一個新進來 的連接都會創建一個 SocketChannel。
DatagramChannel
---- 通過 UDP 讀寫網絡中的數據通道
五、NIO 的非阻塞式網絡通信
1、選擇器(Selector)
2、SocketChannel、ServerSocketChannel、DatagramChannel
六、管道(Pipe)
七、Java NIO2 (Path、Paths 與 Files )
總結
以上是生活随笔為你收集整理的java8 nio_Java8之 NIO的学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 计算前几天,php计算几分钟前、
- 下一篇: java ee 6 源码_Java EE