關於Java IO與NIO知識都在這裡

SnailClimb發表於2019-03-04

Java面試通關手冊(Java學習指南) Github地址(目前還在完善中,歡迎大家一起完善):github.com/Snailclimb/…

IO流學習總結

一 Java IO,硬骨頭也能變軟

主要內容:

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

按操作方式分類結構圖:

(2)按操作物件分類結構圖

按操作物件分類結構圖

二 java IO體系的學習總結

  1. IO流的分類:

    • 按照流的流向分,可以分為輸入流和輸出流;
    • 按照操作單元劃分,可以劃分為位元組流和字元流;
    • 按照流的角色劃分為節點流和處理流。
  2. 流的原理淺析:

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

    • InputStream/Reader: 所有的輸入流的基類,前者是位元組輸入流,後者是字元輸入流。
    • OutputStream/Writer: 所有輸出流的基類,前者是位元組輸出流,後者是字元輸出流。
  3. 常用的io流的用法

三 Java IO面試題

NIO學習總結

一 Java NIO 概覽

主要內容:

  1. NIO簡介:

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

  2. NIO的特性/NIO與IO區別:

    • 1)IO是面向流的,NIO是面向緩衝區的;
    • 2)IO流是阻塞的,NIO流是不阻塞的;
    • 3)NIO有選擇器,而IO沒有。
  3. 讀資料和寫資料方式:

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

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

  4. NIO核心元件簡單介紹

    • Channels
    • Buffers
    • Selectors

二 Java NIO 之 Buffer(緩衝區)

主要內容:

  1. Buffer(緩衝區)介紹:

    • Java NIO Buffers用於和NIO Channel互動。 我們從Channel中讀取資料到buffers裡,從Buffer把資料寫入到Channels;
    • Buffer本質上就是一塊記憶體區;
    • 一個Buffer有三個屬性是必須掌握的,分別是:capacity容量、position位置、limit限制。
  2. Buffer的常見方法

    • Buffer clear()
    • Buffer flip()
    • Buffer rewind()
    • Buffer position(int newPosition)
  3. Buffer的使用方式/方法介紹:

    • 分配緩衝區(Allocating a Buffer):
    ByteBuffer buf = ByteBuffer.allocate(28);//以ByteBuffer為例子
    複製程式碼
    • 寫入資料到緩衝區(Writing Data to a Buffer)

    寫資料到Buffer有兩種方法:

    1.從Channel中寫資料到Buffer

    int bytesRead = inChannel.read(buf); //read into buffer.
    複製程式碼

    2.通過put寫資料:

    buf.put(127);
    複製程式碼
  4. Buffer常用方法測試

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

三 Java NIO 之 Channel(通道)

主要內容:

  1. Channel(通道)介紹
    • 通常來說NIO中的所有IO都是從 Channel(通道) 開始的。
    • NIO Channel通道和流的區別:
  2. FileChannel的使用
  3. SocketChannel和ServerSocketChannel的使用
  4. ️DatagramChannel的使用
  5. Scatter / Gather
    • Scatter: 從一個Channel讀取的資訊分散到N個緩衝區中(Buufer).
    • Gather: 將N個Buffer裡面內容按照順序傳送到一個Channel.
  6. 通道之間的資料傳輸
    • 在Java NIO中如果一個channel是FileChannel型別的,那麼他可以直接把資料傳輸到另一個channel。
    • transferFrom() :transferFrom方法把資料從通道源傳輸到FileChannel
    • transferTo() :transferTo方法把FileChannel資料傳輸到另一個channel

四 Java NIO之Selector(選擇器)

主要內容:

  1. Selector(選擇器)介紹

    • Selector 一般稱 為選擇器 ,當然你也可以翻譯為 多路複用器 。它是Java NIO核心元件中的一個,用於檢查一個或多個NIO Channel(通道)的狀態是否處於可讀、可寫。如此可以實現單執行緒管理多個channels,也就是可以管理多個網路連結。
    • 使用Selector的好處在於: 使用更少的執行緒來就可以來處理通道了, 相比使用多個執行緒,避免了執行緒上下文切換帶來的開銷。
  2. Selector(選擇器)的使用方法介紹

    • Selector的建立
    Selector selector = Selector.open();
    複製程式碼
    • 註冊Channel到Selector(Channel必須是非阻塞的)
    channel.configureBlocking(false);
    SelectionKey key = channel.register(selector, Selectionkey.OP_READ);
    複製程式碼
    • SelectionKey介紹

      一個SelectionKey鍵表示了一個特定的通道物件和一個特定的選擇器物件之間的註冊關係。

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

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

    • 停止選擇的方法

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

  3. 模板程式碼

    有了模板程式碼我們在編寫程式時,大多數時間都是在模板程式碼中新增相應的業務程式碼。

  4. 客戶端與服務端簡單互動例項

五  Java NIO之擁抱Path和Files

主要內容

一 檔案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()遍歷整個目錄

六  NIO學習總結以及NIO新特性介紹

  • 記憶體對映:

這個功能主要是為了提高大檔案的讀寫速度而設計的。記憶體對映檔案(memory-mappedfile)能讓你建立和修改那些大到無法讀入記憶體的檔案。有了記憶體對映檔案,你就可以認為檔案已經全部讀進了記憶體,然後把它當成一個非常大的陣列來訪問了。將檔案的一段區域對映到記憶體中,比傳統的檔案處理速度要快很多。記憶體對映檔案它雖然最終也是要從磁碟讀取資料,但是它並不需要將資料讀取到OS核心緩衝區,而是直接將程式的使用者私有地址空間中的一部分割槽域與檔案物件建立起對映關係,就好像直接從記憶體中讀、寫檔案一樣,速度當然快了。

七 Java NIO AsynchronousFileChannel非同步檔案通

Java7中新增了AsynchronousFileChannel作為nio的一部分。AsynchronousFileChannel使得資料可以進行非同步讀寫。

八 高併發Java(8):NIO和AIO

推薦閱讀

在 Java 7 中體會 NIO.2 非同步執行的快樂

Java AIO總結與示例

AIO是非同步IO的縮寫,雖然NIO在網路操作中,提供了非阻塞的方法,但是NIO的IO行為還是同步的。對於NIO來說,我們的業務執行緒是在IO操作準備好時,得到通知,接著就由這個執行緒自行進行IO操作,IO操作本身是同步的。

如果大家想搭建個人部落格(一般使用的是第三方WordPress搭建或者你也可以使用Tale等開源部落格系統搭建,非常方便)或者說使用redis資料庫、負載均衡等等第三方服務的話,推薦大家使用阿里雲,客觀角度來講,阿里雲的服務與質量都是最好的,而且學生優惠特別大,一年一下也就100多塊錢。這裡是我的優惠券地址(我本人使用的是輕量級伺服器):優惠券地址

歡迎關注我的微信公眾號:"Java面試通關手冊"(一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源):

相關文章