IO流學習總結
一 Java IO,硬骨頭也能變軟
(1) 按操作方式分類結構圖:
(2)按操作對象分類結構圖
二 java IO體系的學習總結
-
IO流的分類:
- 按照流的流向分,可以分爲輸入流和輸出流;
- 按照操作單元劃分,可以劃分爲字節流和字符流;
- 按照流的角色劃分爲節點流和處理流。
-
流的原理淺析:
java Io流共涉及40多個類,這些類看上去很雜亂,但實際上很有規則,而且彼此之間存在非常緊密的聯繫, Java Io流的40多個類都是從如下4個抽象類基類中派生出來的。
- InputStream/Reader: 所有的輸入流的基類,前者是字節輸入流,後者是字符輸入流。
- OutputStream/Writer: 所有輸出流的基類,前者是字節輸出流,後者是字符輸出流。
-
常用的io流的用法
三 Java IO面試題
NIO與AIO學習總結
一 Java 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
二 Java NIO 之 Buffer(緩衝區)
-
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):
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);
-
Buffer常用方法測試
說實話,NIO編程真的難,通過後面這個測試例子,你可能才能勉強理解前面說的Buffer方法的作用。
三 Java NIO 之 Channel(通道)
- 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
四 Java NIO之Selector(選擇器)
-
Selector(選擇器)介紹
- Selector 一般稱 爲選擇器 ,當然你也可以翻譯爲 多路複用器 。它是Java NIO核心組件中的一個,用於檢查一個或多個NIO Channel(通道)的狀態是否處於可讀、可寫。如此可以實現單線程管理多個channels,也就是可以管理多個網絡鏈接。
- 使用Selector的好處在於: 使用更少的線程來就可以來處理通道了, 相比使用多個線程,避免了線程上下文切換帶來的開銷。
-
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()方法。
-
模板代碼
有了模板代碼我們在編寫程序時,大多數時間都是在模板代碼中添加相應的業務代碼。
-
客戶端與服務端簡單交互實例
五 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操作本身是同步的。