BIO、NIO、AIO是Java中常見的三種IO模型
- BIO:采用阻塞式I/O模型,線程在執行I/O操作時被阻塞,無法處理其他任務,適用于連接數比較少的場景;
- NIO:采用非阻塞 I/O 模型,線程在等待 I/O 時可執行其他任務,通過 Selector 監控多個 Channel 上的事件,適用于連接數多但連接時間短的場景。
- AIO:使用異步 I/O 模型,線程發起 I/O 請求后立即返回,當 I/O 操作完成時通過回調函數通知線程,適用于連接數多且連接時間長的場景。
簡單說一下BIO
- BIO,也就是傳統的 IO,基于字節流或字符流(如 FileInputStream、BufferedReader 等)進行文件讀寫,基于 Socket 和 ServerSocket 進行網絡通信。對于每個連接,都需要創建一個獨立的線程來處理讀寫操作。
簡單說一下NIO
-
NIO,JDK 1.4 時引入,放在 java.nio 包下,提供了 Channel、Buffer、Selector 等新的抽象,基于 RandomAccessFile、FileChannel、ByteBuffer 進行文件讀寫,基于 SocketChannel 和 ServerSocketChannel 進行網絡通信。
實際上,“舊”的 I/O 包已經使用 NIO 重新實現過,所以在進行文件讀寫時,NIO 并無法體現出比 BIO 更可靠的性能。
NIO 的魅力主要體現在網絡編程中,服務器可以用一個線程處理多個客戶端連接,通過 Selector 監聽多個 Channel 來實現多路復用,極大地提高了網絡編程的性能。
緩沖區Buffer也能極大提升一次IO操作的效率
簡單說一下AIO
-
AIO 是 Java 7 引入的,放在 java.nio.channels 包下,提供了 AsynchronousFileChannel、AsynchronousSocketChannel 等異步 Channel。
-
它引入了異步通道的概念,使得 I/O 操作可以異步進行。這意味著線程發起一個讀寫操作后不必等待其完成,可以立即進行其他任務,并且當讀寫操作真正完成時,線程會被異步地通知。
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(Paths.get("test.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> result = fileChannel.read(buffer, 0);
while (!result.isDone()) {// do something
}