Java IO/NIO學習總結

下面是本身學習整理Java IO/NIO的總結,期間瀏覽了網上不少優秀的總結分析文章,一併貼在這裏供你們學習參考。IO的知識點學習大概分爲如下幾個部分:css

  1. 概念理解html

  2. 熟悉Java IO API前端

  3. 熟悉Java NIO APIjava

  4. 系統的IO優化git

  5. 優秀IO/NIO開源框架學習web

第一部分:概念理解數據庫

什麼是IO?IO就是Input(輸入)和Output(輸出),好比:從文件系統中讀取某個文件的內容,一臺服務器將數據發送到另外一臺服務器,這些都是IO操做。IO研究的問題無非就是把什麼樣的數據(數據格式)以什麼數據形式發送到哪裏的問題。後端

第二部分:熟悉Java IO  API瀏覽器

  1. 基於字節操做的 I/O 接口:InputStream 和 OutputStream緩存

  2. 基於字符操做的 I/O 接口:Writer 和 Reader

  3. 基於磁盤操做的 I/O 接口:File(重點)

  4. 基於網絡操做的 I/O 接口:Socket(重點)

前兩組主要是根據傳輸數據的數據格式,後兩組主要是根據傳輸數據的方式,雖然 Socket 類並不在 java.io 包下,可是它的實質也是IO。

第三部分:熟悉Java NIO  API

Java NIO的出現是爲了彌補IO在不少方面的不足。Java NIO是基於Buffer和Channel的。他們最主要的區別在於:

IO NIO
Stream oriented(面向流) Buffer oriented(面向buffer)
Blocking IO(阻塞) Non blocking IO(非阻塞)
  Selector(選擇器)

傳統IO操做狀態沒法記錄,不知道讀/寫了多少,還有多少是有效字節,下次從哪裏開始讀/寫,NIO則很好的解決了這個問題,使得操做更加精確可控,並且讀寫效率更高。

NIO裏關鍵的Buffer實現:

  • ByteBuffer

  • CharBuffer

  • IntBuffer

  • ShortBuffer

  • LongBuffer

  • FloatBuffer

  • DoubleBuffer

  • MappedbyteBuffer

NIO裏關鍵的Channel實現:

  • FileChannel:從文件中讀寫數據

  • DatagramChannel:經過UDP 讀寫網絡中的數據

  • SocketChannel:經過TCP讀寫網絡中的數據

  • ServerSocketChannel:能夠監聽新進來的TCP鏈接,像web 服務器那樣。對每個新進來得鏈接都會建立一個SocketChannel。

其它重要的類:

  • Selector

  • SelectionKey

  • Channels

重要概念的理解:同步、異步、阻塞、非阻塞

buffer的理解:capacity、limit、position、mark

第四部分:系統的IO優化

磁盤IO優化:

  • 增長緩存,減小磁盤訪問次數

  • 優化磁盤的管理系統,設計最優的磁盤訪問策略,以及磁盤的尋址策略,這裏是在底層操做系統層面考慮的。

  • 設計合理的磁盤存儲數據塊,以及訪問這些數據塊的策略,這裏是在應用層面考慮的。如咱們能夠給存放的數據設計索引,經過尋址索引來加快和減小磁盤的訪問,還有能夠採用異步和非阻塞的方式加快磁盤的訪問效率。

  • 應用合理的 RAID 策略提高磁盤 IO,

網絡IO優化:

  • 一個是減小網絡交互的次數:要減小網絡交互的次數一般咱們在須要網絡交互的兩端會設置緩存,好比 Oracle 的 JDBC 驅動程序,就提供了對查詢的 SQL 結果的緩存,在客戶端和數據庫端都有,能夠有效的減小對數據庫的訪問。關於 Oracle JDBC 的內存管理能夠參考《 Oracle JDBC 內存管理》。除了設置緩存還有一個辦法是,合併訪問請求:如在查詢數據庫時,咱們要查 10 個 id,我能夠每次查一個 id,也能夠一次查 10 個 id。再好比在訪問一個頁面時經過會有多個 js 或 css 的文件,咱們能夠將多個 js 文件合併在一個 HTTP 連接中,每一個文件用逗號隔開,而後發送到後端 Web 服務器根據這個 URL 連接,再拆分出各個文件,而後打包再一併發回給前端瀏覽器。這些都是經常使用的減小網絡 I/O 的辦法。

  • 減小網絡傳輸數據量的大小:減小網絡數據量的辦法一般是將數據壓縮後再傳輸,如 HTTP 請求中,一般 Web 服務器將請求的 Web 頁面 gzip 壓縮後在傳輸給瀏覽器。還有就是經過設計簡單的協議,儘可能經過讀取協議頭來獲取有用的價值信息。好比在代理程序設計時,有 4 層代理和 7 層代理都是來儘可能避免要讀取整個通訊數據來取得須要的信息。

  • 儘可能減小編碼:一般在網絡 I/O 中數據傳輸都是以字節形式的,也就是一般要序列化。可是咱們發送要傳輸的數據都是字符形式的,從字符到字節必須編碼。可是這個編碼過程是比較耗時的,因此在要通過網絡 I/O 傳輸時,儘可能直接以字節形式發送。也就是儘可能提早將字符轉化爲字節,或者減小字符到字節的轉化過程。

  • 根據應用場景設計合適的交互方式:所謂的交互場景主要包括同步與異步阻塞與非阻塞方式

第五部分:優秀IO/NIO開源框架學習

目前開源社區比較優秀的IO/NIO開源框架有:Apache MINANetty

經過學習優秀的開源框架,咱們能夠昇華咱們所學,進一步的加深對IO/NIO的理解。如下是一些優秀的參考博客:

一、Java NIO系列教程(重點推薦):

http://www.iteye.com/magazines/132-Java-NIO

二、深刻分析 Java I/O 的工做機制(重點推薦):

https://www.ibm.com/developerworks/cn/java/j-lo-javaio/

三、深刻分析Java中的中文編碼問題(重點推薦):

https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

四、Java深刻歷險——Java IO

http://www.infoq.com/cn/articles/cf-java-i-o

五、Java NIO分析

https://askingwindy.gitbooks.io/gitbook-java-interview-note/content/io/syn-ays-blocked/nio.html

六、Java NIO原理圖文分析

http://weixiaolu.iteye.com/blog/1479656

相關文章
相關標籤/搜索