天天看點

Java NIO

IO流學習總結

(1) 按操作方式分類結構圖:

Java NIO

(2)按操作對象分類結構圖

Java NIO

IO流的分類:

按照流的流向分,可以分為輸入流和輸出流;

按照操作單元劃分,可以劃分為位元組流和字元流;

按照流的角色劃分為節點流和處理流。

流的原理淺析:

java Io流共涉及40多個類,這些類看上去很雜亂,但實際上很有規則,而且彼此之間存在非常緊密的聯系, Java Io流的40多個類都是從如下4個抽象類基類中派生出來的。

InputStream/Reader: 所有的輸入流的基類,前者是位元組輸入流,後者是字元輸入流。

OutputStream/Writer: 所有輸出流的基類,前者是位元組輸出流,後者是字元輸出流。

常用的io流的用法

NIO學習總結

NIO簡介:

Java NIO 是 java 1.4, 之後新出的一套IO接口NIO中的N可以了解為Non-blocking,不單純是New。

NIO的特性/NIO與IO差別:

1)IO是面向流的,NIO是面向緩沖區的;

2)IO流是阻塞的,NIO流是不阻塞的;

3)NIO有選擇器,而IO沒有。

讀資料和寫資料方式:

從通道進行資料讀取 :建立一個緩沖區,然後請求通道讀取資料。

從通道進行資料寫入 :建立一個緩沖區,填充資料,并要求通道寫入資料。

NIO核心元件簡單介紹

Channels

Buffers

Selectors

Buffer(緩沖區)介紹:

Java NIO Buffers用于和NIO Channel互動。 我們從Channel中讀取資料到buffers裡,從Buffer把資料寫入到Channels;

Buffer本質上就是一塊記憶體區;

一個Buffer有三個屬性是必須掌握的,分别是:capacity容量、position位置、limit限制。

Buffer的常見方法

Buffer clear()

Buffer flip()

Buffer rewind()

Buffer position(int newPosition)

Buffer的使用方式/方法介紹:

配置設定緩沖區(Allocating a Buffer):

寫入資料到緩沖區(Writing Data to a Buffer)

寫資料到Buffer有兩種方法:

1.從Channel中寫資料到Buffer

2.通過put寫資料:

Buffer常用方法測試

說實話,NIO程式設計真的難,通過後面這個測試例子,你可能才能勉強了解前面說的Buffer方法的作用。

Channel(通道)介紹

通常來說NIO中的所有IO都是從 Channel(通道) 開始的。

NIO Channel通道和流的差別:

FileChannel的使用

SocketChannel和ServerSocketChannel的使用

️DatagramChannel的使用

Scatter / Gather

Scatter: 從一個Channel讀取的資訊分散到N個緩沖區中(Buufer).

Gather: 将N個Buffer裡面内容按照順序發送到一個Channel.

通道之間的資料傳輸

在Java NIO中如果一個channel是FileChannel類型的,那麼他可以直接把資料傳輸到另一個channel。

transferFrom() :transferFrom方法把資料從通道源傳輸到FileChannel

transferTo() :transferTo方法把FileChannel資料傳輸到另一個channel

Selector(選擇器)介紹

Selector 一般稱 為選擇器 ,當然你也可以翻譯為 多路複用器 。它是Java NIO核心元件中的一個,用于檢查一個或多個NIO Channel(通道)的狀态是否處于可讀、可寫。如此可以實作單線程管理多個channels,也就是可以管理多個網絡連結。

使用Selector的好處在于: 使用更少的線程來就可以來處理通道了, 相比使用多個線程,避免了線程上下文切換帶來的開銷。

Selector(選擇器)的使用方法介紹

Selector的建立

注冊Channel到Selector(Channel必須是非阻塞的)

SelectionKey介紹

一個SelectionKey鍵表示了一個特定的通道對象和一個特定的選擇器對象之間的注冊關系。

從Selector中選擇channel(Selecting Channels via a Selector)

選擇器維護注冊過的通道的集合,并且這種注冊關系都被封裝在SelectionKey當中.

停止選擇的方法

wakeup()方法 和close()方法。

模闆代碼

有了模闆代碼我們在編寫程式時,大多數時間都是在模闆代碼中添加相應的業務代碼。

用戶端與服務端簡單互動執行個體

一 檔案I/O基石:Path:

建立一個Path

File和Path之間的轉換,File和URI之間的轉換

擷取Path的相關資訊

移除Path中的備援項

二 擁抱Files類:

Files.exists() 檢測檔案路徑是否存在

Files.createFile() 建立檔案

Files.createDirectories()和Files.createDirectory()建立檔案夾

Files.delete()方法 可以删除一個檔案或目錄

Files.copy()方法可以吧一個檔案從一個位址複制到另一個位置

擷取檔案屬性

周遊一個檔案夾

Files.walkFileTree()周遊整個目錄