好热闹

好热闹

bbbbb

二、NIO的基本開發方式

channel 簡介#

  1. IO 通訊的通道,類似於 InputStream、OutputStream
    1. Channel 沒有方向性

image

  • 常見 Channel
  1. 檔案操作
    FileChannel,讀寫檔案中的資料。
  2. 網路操作
    SocketChannel,通過 TCP 讀寫網路中的資料。
    ServerSockectChannel,監聽新進來的 TCP 連接,像 Web 伺服器那樣。對每一個新進來的連接都會創建一個 SocketChannel。
    DatagramChannel,通過 UDP 讀寫網路中的資料。
  • 獲得 channel 的方式

    1. FileInputStreanm/FileOutputStream
      1. RandomAccessFile
    2. Socket
    3. ServerSocket
    4. DatagramSocket

    Buffer 簡介#

  1. Channel 讀取或者寫入的資料,都要寫到 Buffer 中,才可以被程式操作。
  2. 因為 Channel 沒有方向性,所以 Buffer 為了區分讀寫,引入了讀模式、寫模式進行區分。

image

  • 常見 buffer
  1. ByteBuffer 常用
  2. CharBuffer
  3. DoubleBuffer
  4. FloatBuffer
  5. IntBuffer
  6. LongBuffer
  7. ShortBuffer
  8. MappedByteBuffer.. 常用
  • 獲得 buffer 的方式
  1. ByteBuffer.allocate(10);
  2. encode()
package nio;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * NIO channel 和 buffer 使用
 * **/
public class Main {
    public static void main(String[] args) throws IOException {

        // 1. 獲取檔案的channel
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\IdeaProjects\\untitled\\1.txt");
        FileChannel channel = fileInputStream.getChannel();

        // 創建buffer
        ByteBuffer buffer = ByteBuffer.allocate(10);

       while(true){
           // 從channel中讀取資料,buffer剛創建時為寫模式,所以無需切換模式
           // channel.read 返回的int 如果是-1 代表沒有資料了,相反則返回讀取的位元組數量
           int read = channel.read(buffer);

           // 返回為-1時,結束迴圈
           if (read == -1)break;


           // 設置為讀模式
           buffer.flip();

           // 迴圈讀取buffer中的資料,buffer.hasRemaining()可以判斷buffer中是否還有資料
           while (buffer.hasRemaining()){
               byte b = buffer.get();
               System.out.println((char)b);
           }

           // 最後讀完資料切換為寫模式(在這個程式中不寫也能運行,但讀完切換模式是良好的編程習慣,日後會少遇到很多麻煩)
           buffer.clear();
       }

    }
}

NIO 開發的步驟總結#

  1. 獲取 Channel
  2. 創建 Buffer
  3. channel.read (buffer); // 迴圈的從 Channel 中獲取資料,讀入到 Buffer 中。進行操作 。
    buffer.flip ();// 設置讀模式
    buffer.get (); 迴圈從 buffer 中獲取資料。
    buffer.clear ();// 設置寫模式
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。