NIO知識點簡單記錄一
阿新 • • 發佈:2018-12-09
一:NIO簡介
- 簡介
- NIO和IO主要的區別
- 通道和緩衝區
二:NIO中的緩衝區
- 簡介
緩衝區在java NIO中就是負責資料的存取,緩衝區就是陣列,用於儲存不同型別的資料。
並且根據資料型別不同(boolean除外),我們可以使用不同型別的緩衝區。例如:
ByteBuffer(這個最常用),CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,
DoubleBuffer等。並且上面這幾種緩衝區的管理方式幾乎一致,通過allocate()獲取緩衝區。 - 緩衝區存取資料的兩個核心方法
a:put() -----> 表示存入資料到緩衝區
b:get() ----->表示獲取緩衝區中的資料
c:ByteBuffer.allocate(1024).hasRemaining(); 表示判斷緩衝區中是否還有可以獲取的資料 - 緩衝區中的四大核心屬性
a:capacity
表示容量,表示緩衝區中最大儲存資料的容量。一旦宣告就不能改變。
b:limit
表示界限,表示緩衝區中可以操作資料的大小。(limit後資料不能讀寫)
c:position
表示位置,表示緩衝區中正在操作資料的位置。
d:mark
表示標記,用來記錄當前position的位置,可以通過reset()方法恢復到mark標記的位置。
0 <= position <= limit <= capacity
- 不同情況下緩衝區的各個屬性值
a:程式碼示例
b:效果
c:解析圖
c:mark標記的相關示例
效果:
三:NIO直接緩衝區和非直接緩衝區
- 什麼是直接緩衝區和非直接緩衝區?
直接緩衝區:就是通過allocate()方法分配的緩衝區,是將緩衝區建立在JVM的記憶體中。
非直接緩衝區:就是通過allocateDirect()方法分配的緩衝區,將緩衝區分配在實體記憶體中。
(實體記憶體就是你的記憶體條的實際記憶體,虛擬記憶體是設在硬碟上用作記憶體的虛擬的記憶體)
四: NIO通道(Channel)的原理與獲取
- 什麼是通道?
總結:
通道就是用於源節點和目標節點的連結。在java NIO中負責緩衝區中資料的傳輸,Channel本身
不儲存資料,因此需要配合緩衝區進行傳輸。
五: 相關檔案操作例項
- 使用通道完成jpg格式照片的複製(使用的是非直接緩衝區)
a:程式碼如下
b:效果
- 使用通道完成jpg格式照片的複製(使用的是直接緩衝區)
a:程式碼(這種方式效率雖然高,但是它無法及時釋放記憶體,可能會導致實體記憶體被佔用過多)
b:效果
- 通道之間的資料傳輸(直接緩衝區的方法)
a:程式碼
效果:
六: 分散讀取與聚集寫入
- 什麼是分散讀取和聚集寫入
a:分散讀取:將通道中的資料分散到多個緩衝區中
b:聚集寫入:將多個緩衝區中的資料聚集到通道中