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

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

IO流學習總結

一 Java IO,硬骨頭也能變軟

主要內容:

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

按操做方式分類結構圖:

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

按操做對象分類結構圖

二 java IO體系的學習總結

  1. IO流的分類:github

    • 按照流的流向分,能夠分爲輸入流和輸出流;
    • 按照操做單元劃分,能夠劃分爲字節流和字符流;
    • 按照流的角色劃分爲節點流和處理流。
  2. 流的原理淺析:面試

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

    • 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學習資源):

相關文章
相關標籤/搜索