下面是本身學習整理Java IO/NIO的總結,期間瀏覽了網上不少優秀的總結分析文章,一併貼在這裏供你們學習參考。IO的知識點學習大概分爲如下幾個部分:css
概念理解html
熟悉Java IO API前端
熟悉Java NIO APIjava
系統的IO優化git
優秀IO/NIO開源框架學習web
第一部分:概念理解數據庫
什麼是IO?IO就是Input(輸入)和Output(輸出),好比:從文件系統中讀取某個文件的內容,一臺服務器將數據發送到另外一臺服務器,這些都是IO操做。IO研究的問題無非就是把什麼樣的數據(數據格式)以什麼數據形式發送到哪裏的問題。後端
第二部分:熟悉Java IO API瀏覽器
基於字節操做的 I/O 接口:InputStream 和 OutputStream緩存
基於字符操做的 I/O 接口:Writer 和 Reader
基於磁盤操做的 I/O 接口:File(重點)
基於網絡操做的 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 MINA、Netty
經過學習優秀的開源框架,咱們能夠昇華咱們所學,進一步的加深對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原理圖文分析