Learning Dairy
2017年07月24日
- 學習在 MWeb 下使用 MarkDown 語法書寫文檔。
- JUnit4 的基本使用
- Java NIO
- NIO 與 IO 的區別
- 緩衝區和通道
- 文件通道
- NIO 的非阻塞式網絡通信
- 選擇器
- SocketChannel、ServerSocketChannel、DatagramChannal
- 管道
- Java NIO2(Path、Paths與File)
NIO與IO的區別
IO 是面向流的,NIO 是面向緩衝區的。
IO 流是單向的,緩衝區是雙向的。
IO 是阻塞式,NIO 是非阻塞。
緩衝區
在 Java NIO 中負責數據的存取。緩衝區就是數組。用於存儲不用數據類型的數據。
根據數據類型的不同( boolean 除外),提供了相應類型的緩衝區:
ByteBuffer、 CharBuffer、 ShortBuffer、 IntBuffer、 LongBuffer、 FloatBuffer、 DoubleBuffer
上述緩衝區的管理方式幾乎一致,通過 allocate() 獲取緩衝區:
ByteBuffer buf = ByteBuffer.allocate(1024);
緩衝區存取數據的兩個核心方法:
put() : 存入數據到緩衝區中
get() : 獲取緩衝區中的數據
其他方法:
filp() : 切換到讀模式
rewind() : 重讀數據
clear() : 清空緩衝區(其實數據仍然存在)
reset() : 恢復到 mark 標記
hasRemaining() : 是否有未讀取數據
緩衝區中的四個核心屬性:
capacity : 容量,表示緩衝區中最大存儲數據的容量。一旦聲明不能改變。
limit : 界限,表示緩衝區中可以操作數據的大小。
position : 位置,表示緩衝區中正在操作數據的位置。
mark : 標記,表示記錄當前 position 的位置。可以通過 reset() 恢復到 mark 的位置。
直接緩衝區與非直接緩衝區:
非直接緩衝區 : 通過 allocate() 方法分配緩衝區,將緩衝區建立在 JVM 的內存中。
直接緩衝區 : 通過 allocateDirect() 方法分配直接緩衝區,將緩衝區建立在物理內存中,可以提高效率。
isDirect() : 判斷一個buffer是否是直接緩衝區。
通道
用於源節點與目標節點的連接,在 Java NIO 中負責緩衝區中數據的傳輸,Channel 本身不存儲數據,因此需要配合緩衝區進行傳輸。
通道的主要實現類 :
java.nio.channels.Channel 接口
- FileChannel
- SocketChannel
- ServerSocketChannel
- DatagramChannel
獲取通道的方法 :
Java 針對支持通道的類提供了 getChannel() 方法
本地IO : FileInputStream/FileOutputStream
網絡IO : Socket/ServerSocket/DatagramSocket
- 在 JDK 1.7 中的 NIO.2 針對各個通道提供了靜態方法 open()
- 在 JDK 1.7 中的 NIO.2 的 Files 工具類的 newByteChannel()