Java中處理I/O操作的不同方式
Java中處理I/O操作的不同方式:BIO,NIO,AIO
首先,我們需要知道,Java中處理I/O操作的不同方式的不同方式有幾種。
BIO、NIO和AIO是Java中處理I/O操作的三種不同方式,它們分別代表阻塞I/O、非阻塞I/O和異步I/O。下面是對(duì)它們的詳細(xì)介紹,在這里我們結(jié)合代碼進(jìn)行一個(gè)綜合演示,代碼由于是偽代碼,可能存在不足,僅供大家參考:
BIO(Blocking I/O)阻塞I/O:
特點(diǎn): 在阻塞I/O中,當(dāng)一個(gè)線程在進(jìn)行I/O操作時(shí),它會(huì)被阻塞,直到操作完成。這意味著當(dāng)一個(gè)線程在讀取或?qū)懭霐?shù)據(jù)時(shí),它無(wú)法執(zhí)行其他任務(wù),直到I/O操作完成。
適用場(chǎng)景: 適用于連接數(shù)較少且連接時(shí)間較長(zhǎng)的情況,例如傳統(tǒng)的Socket編程。
代碼演示:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class BlockingIOServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket clientSocket = serverSocket.accept(); // 阻塞等待客戶端連接
InputStream inputStream = clientSocket.getInputStream();
// 處理輸入流,阻塞直到數(shù)據(jù)可讀
int data = inputStream.read();
System.out.println("Received data: " + data);
// 其他業(yè)務(wù)邏輯處理
}
}
}
NIO(Non-blocking I/O)非阻塞I/O:
特點(diǎn): NIO引入了通道(Channel)和緩沖區(qū)(Buffer)的概念,以及選擇器(Selector)來(lái)實(shí)現(xiàn)非阻塞I/O。在非阻塞I/O中,一個(gè)線程可以管理多個(gè)通道,通過(guò)選擇器監(jiān)視這些通道的狀態(tài),當(dāng)一個(gè)通道可讀或可寫時(shí),線程可以切換到其他任務(wù),而不需要等待I/O操作完成。
適用場(chǎng)景: 適用于連接數(shù)較多但每個(gè)連接的交互時(shí)間短的情況,例如網(wǎng)絡(luò)編程中的聊天室。
代碼演示:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NonBlockingIOServer {
public static void main(String[] args) throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8888));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isAcceptable()) {
// 處理連接
SocketChannel clientChannel = serverSocketChannel.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
// 處理讀事件
SocketChannel clientChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = clientChannel.read(buffer);
System.out.println("Received data: " + new String(buffer.array(), 0, bytesRead));
// 其他業(yè)務(wù)邏輯處理
clientChannel.close();
}
keyIterator.remove();
}
}
}
}
AIO(Asynchronous I/O)異步I/O:
特點(diǎn): AIO引入了異步I/O操作,其中讀/寫請(qǐng)求被提交給操作系統(tǒng),而應(yīng)用程序繼續(xù)執(zhí)行其他任務(wù)。當(dāng)操作系統(tǒng)完成I/O操作時(shí),會(huì)通知應(yīng)用程序,這樣就實(shí)現(xiàn)了異步的I/O操作。
適用場(chǎng)景: 適用于連接數(shù)較多且每個(gè)連接的交互時(shí)間不確定的情況,例如在高并發(fā)的網(wǎng)絡(luò)服務(wù)器中。
代碼演示:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class AsyncIOServer {
public static void main(String[] args) throws IOException {
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8888));
serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
@Override
public void completed(AsynchronousSocketChannel clientChannel, Void attachment) {
serverSocketChannel.accept(null, this);
// 繼續(xù)接收下一個(gè)連接
ByteBuffer buffer = ByteBuffer.allocate(1024);
clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer bytesRead, ByteBuffer buffer) {
System.out.println("Received data: " + new String(buffer.array(), 0, bytesRead));
// 其他業(yè)務(wù)邏輯處理
clientChannel.close();
}
@Override
public void failed(Throwable exc, ByteBuffer buffer) {
// 處理讀取失敗
}
});
}
@Override
public void failed(Throwable exc, Void attachment) {
// 處理接受連接失敗
}
});
// 阻塞主線程,保持服務(wù)端運(yùn)行
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
總的來(lái)說(shuō),BIO適用于連接數(shù)較少且連接時(shí)間較長(zhǎng)的場(chǎng)景,NIO適用于連接數(shù)較多但每個(gè)連接的交互時(shí)間短的場(chǎng)景,而AIO適用于連接數(shù)較多且每個(gè)連接的交互時(shí)間不確定的場(chǎng)景。選擇合適的I/O模型取決于具體的應(yīng)用需求。在Java中,NIO和AIO是在Java 1.4 和 Java 7 中引入的,分別位于java.nio和java.nio.channels包中。
以上就是Java中處理I/O操作的不同方式的詳細(xì)內(nèi)容,更多關(guān)于Java處理I/O操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringMVC之RequestContextHolder詳細(xì)解析
這篇文章主要介紹了SpringMVC之RequestContextHolder詳細(xì)解析,正常來(lái)說(shuō)在service層是沒有request的,然而直接從controlller傳過(guò)來(lái)的話解決方法太粗暴,后來(lái)發(fā)現(xiàn)了SpringMVC提供的RequestContextHolder,需要的朋友可以參考下2023-11-11
Springboot輕量級(jí)的監(jiān)控組件SpringbootAdmin
這篇文章主要為大家介紹了Springboot輕量級(jí)的監(jiān)控組件SpringbootAdmin使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java實(shí)現(xiàn)JWT登錄認(rèn)證的示例代碼
Java中我們可以使用諸如JJWT這樣的庫(kù)來(lái)生成和驗(yàn)證JWT,本文主要介紹了Java實(shí)現(xiàn)JWT登錄認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
簡(jiǎn)單操作實(shí)現(xiàn)Java jsp servlet文件上傳過(guò)程解析
這篇文章主要介紹了簡(jiǎn)單操作實(shí)現(xiàn)Java jsp servlet文件上傳過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
token工作機(jī)制及原理附Java生成token工具類
這篇文章介紹了token工作機(jī)制及原理,內(nèi)附Java生成token工具類Demo。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
詳解Mybatis中javaType和ofType的區(qū)別
本文主要介紹了詳解Mybatis中javaType和ofType的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
SpringBoot之?dāng)r截器與過(guò)濾器解讀
這篇文章主要介紹了SpringBoot之?dāng)r截器與過(guò)濾器解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

