一文让你了解透彻Java中的IO模型
IO模型简介
在计算机中,IO模型是处理输入输出数据流的方法。在Java中,提供了多种IO模型,包括BIO、NIO、AIO。
- BIO: 同步阻塞IO,采用传统的输入输出流,每一个线程并发处理一个客户端的请求。
- NIO: 同步非阻塞IO,采用通道和缓冲区的概念,可以用一个线程并发处理多个客户端的请求。
- AIO: 异步非阻塞IO,采用事件驱动的方式,当数据准备好或操作完成时,会触发回调函数进行处理。
BIO示例
public class BioServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.write("Hello, " + s);
printWriter.flush();
socket.close();
}
}
}
上述代码采用BIO模型实现一个简单的HTTP服务器。当有客户端连接时,程序会创建一个新的线程进行处理。代码中的accept()
方法会阻塞,直到有客户端连接。该模型会导致资源浪费,只支持少量并发连接。
NIO示例
public class NioServer {
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey selectionKey : selectionKeys) {
if (selectionKey.isAcceptable()) {
ServerSocketChannel channel = (ServerSocketChannel) selectionKey.channel();
SocketChannel socketChannel = channel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (selectionKey.isReadable()) {
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.read(buffer);
String s = new String(buffer.array());
buffer.clear();
socketChannel.write(ByteBuffer.wrap(("Hello, " + s).getBytes()));
socketChannel.close();
}
}
selectionKeys.clear();
}
}
}
上述代码采用NIO模型实现一个简单的HTTP服务器。该模型采用单线程通过选择器处理多个客户端连接,并且使用缓冲区进行数据读写。使用NIO模型可以支持更多的并发连接,避免了BIO模型中的资源浪费问题。
总结
Java中提供了多种IO模型,每种模型都有其优劣之处,具体选择取决于应用需求。需要注意的是,在应用中如果出现IO阻塞,要尽量避免采用耗时操作,可以考虑采用非阻塞IO或者异步IO模型进行处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文让你了解透彻Java中的IO模型 - Python技术站