一、簡介
Java NIO (New IO)是JDK1.4後引入的新輸入/輸出API,提供基於緩衝區(buffer)的塊寫入/讀取,而以前的I/O是基於流(Stream)的方式,NIO基於塊的IO操作,將最耗時的緩存區讀取和填充交由底層操作系統實現,因此速度上要快得多;主要由以下三個核心部分組成:
1. channel
2. buffer
3. selector
二、channel - 通道
通道可以理解爲以前的“流”,數據從通道讀取,也可以向通道寫入數據,是雙向的,但是讀取和寫入都必須是使用buffer,即讀取數據時,需要從通道讀取到緩存區,然後再從緩衝區獲取數據,寫入數據也需要先將數據寫入到緩存區,再將緩衝區寫入通道;
NIO中主要有以下通道類型:
- FileChannel - 文件IO
- DatagramChannel - UDP傳輸
- SocketChannel - TCP傳輸
- ServerSocketChannel -TCP傳輸
三、buffer - 緩衝區
緩衝區可以認爲是一個數據容器,可以理解爲一個基本數據類型數組,如字節數組等;NIO中任何數據輸入/輸出都是必須經由緩衝區實現,主要有以下緩衝區類型:
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- MappedByteBuffer
可以看出以上類型覆蓋java的全部基本類型,MappedByteBuffer(內存映射文件,後續章節講解)對於每種buffer都有相同的方法,只有ByteBuffer擁有部分特殊的方法
四、selector - 選擇器
選擇器支持單個線程處理多個channel,將多個channel註冊到一個選擇器中,選擇器基於事件的方式處理;從選擇器獲取註冊channel中關注的事件(如讀、寫)並進行數據處理,非常適用於多個數據量不大、讀寫不頻繁的通道,使用單個線程來處理;
五、NIO簡單(標準)的輸入/輸出
一個簡單(標準)的NIO輸入輸出一般包含如下步驟:
1. 從數據源獲取通道
2. 分配緩衝區
3. 切換緩存區爲寫模式
4. 從通道讀取數據寫入緩衝區
5. 切換緩衝區爲讀模式
6. 緩衝區數據寫入通道中
7. 關閉資源
實例代碼如下:
public class FirstReadAndWriteTest {
public static void main(String[] args) throws IOException {
RandomAccessFile fromFile = new RandomAccessFile("D:/tmp/NIO/fromFile.txt", "rw");
RandomAccessFile toFile = new RandomAccessFile("D:/tmp/NIO/toFile.txt", "rw");
//獲取channel
FileChannel fromChannel = fromFile.getChannel();
FileChannel toChannel = toFile.getChannel();
//分配buffer
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (true) {
//切換到寫入模式
buffer.clear();
//從channel讀取數據到buffer
int read = fromChannel.read(buffer);
if (read == -1) {
break;
}
//切換到讀模式
buffer.flip();
//buffer中內容寫入到目標channel
toChannel.write(buffer);
}
//關閉資源
fromChannel.close();
toChannel.close();
fromChannel.close();
toChannel.close();
}
}
本章節只是Java NIO學習的第一章,主要是對主要核心的三個類的簡單描述,具體詳細內容在後面章節繼續分享;