channel 簡介#
- IO 通訊的通道,類似於 InputStream、OutputStream
- Channel 沒有方向性
- 常見 Channel
- 檔案操作
FileChannel,讀寫檔案中的資料。- 網路操作
SocketChannel,通過 TCP 讀寫網路中的資料。
ServerSockectChannel,監聽新進來的 TCP 連接,像 Web 伺服器那樣。對每一個新進來的連接都會創建一個 SocketChannel。
DatagramChannel,通過 UDP 讀寫網路中的資料。
-
獲得 channel 的方式
- FileInputStreanm/FileOutputStream
-
- RandomAccessFile
- Socket
- ServerSocket
- DatagramSocket
Buffer 簡介#
- Channel 讀取或者寫入的資料,都要寫到 Buffer 中,才可以被程式操作。
- 因為 Channel 沒有方向性,所以 Buffer 為了區分讀寫,引入了讀模式、寫模式進行區分。
- 常見 buffer
- ByteBuffer 常用
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
- MappedByteBuffer.. 常用
- 獲得 buffer 的方式
- ByteBuffer.allocate(10);
- 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 開發的步驟總結#
- 獲取 Channel
- 創建 Buffer
- channel.read (buffer); // 迴圈的從 Channel 中獲取資料,讀入到 Buffer 中。進行操作 。
buffer.flip ();// 設置讀模式
buffer.get (); 迴圈從 buffer 中獲取資料。
buffer.clear ();// 設置寫模式