歡迎使用CSDN-markdown編輯器

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章