Java NIO 學習(一)--簡介

一、簡介

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學習的第一章,主要是對主要核心的三個類的簡單描述,具體詳細內容在後面章節繼續分享;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章