Java語言提供了兩種不同的I/O模型,即BIO (Blocking I/O)和NIO (Non-Blocking I/O)。這兩種模型都可以用于網絡編程和文件系統操作。
BIO模型是一種阻塞式I/O,即當程序調用I/O操作時,程序會一直等待,直到讀取到數據或者寫入數據完成,才能繼續執行。這種模型的優點是代碼簡單易懂,但是當有多個客戶端連接時,每個客戶端都需要一個線程來處理它的請求,這就占用了很多系統資源,當客戶端數量增加時,系統的負載也會增加。
public class BIOServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new Handler(socket)).start();
}
}
}
public class Handler implements Runnable {
Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String request = reader.readLine();
writer.println("Hello, client!");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
NIO模型是一種非阻塞式I/O,即當程序調用I/O操作時,程序不會一直等待,而是可以繼續執行后面的代碼,在數據讀取或者寫入完成后,程序再去處理數據。這種模型的優點是可以使用一個線程處理多個客戶端請求,從而減小系統的負載。但是NIO的代碼比較復雜,需要使用Selector、Channel等類來進行操作。
public class NIOServer {
public static void main(String[] args) throws Exception {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set keys = selector.selectedKeys();
Iterator iterator = keys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.read(buffer);
buffer.flip();
socketChannel.write(buffer);
}
iterator.remove();
}
}
}
}
總的來說,BIO模型適合于客戶端數量較少,每個請求需要長時間處理的場景,而NIO模型適合于客戶端數量較多,每個請求僅需要短時間處理的場景。根據具體的場景需求,選擇不同的I/O模型。