Java NIO 详解
Java NIO(New IO)是一种基于缓冲区、非阻塞IO的API集,主要用于替代传统的Java IO API。它可以更高效地处理IO数据,具有更好的扩展性和灵活性,尤其适用于处理大量连接和请求的场景。
在本文中,我们将从以下几个方面对Java NIO进行详细讲解:
- 缓冲区(Buffer)及其操作
- 通道(Channel)及其操作
- 选择器(Selector)及其操作
- NIO示例:服务端
- NIO示例:客户端
1. 缓冲区(Buffer)及其操作
缓冲区在Java NIO中是一个重要的概念,它用于存储IO数据。我们可以使用Java NIO的缓冲区来读取或写入数据。
1.1 缓冲区类型
Java NIO中主要有以下四种类型的缓冲区:
- ByteBuffer
- CharBuffer
- ShortBuffer
- DoubleBuffer
它们分别对应Java的基本类型byte、char、short和double。在实际使用中,我们通常使用ByteBuffer。
1.2 缓冲区操作
下面是一些常用的缓冲区操作:
- 分配缓冲区:ByteBuffer buffer = ByteBuffer.allocate(1024);
- 写数据到缓冲区:buffer.put("hello world".getBytes());
- 读取数据到缓冲区:buffer.get();
- 设置缓冲区起始位置:buffer.rewind();
- 清空缓冲区:buffer.clear();
2. 通道(Channel)及其操作
通道(Channel)是Java NIO中另一个重要的概念,它用于在缓冲区和IO设备之间传输数据。
通道有以下两种类型:
- FileChannel:用于文件IO的通道
- SocketChannel:用于网络IO的通道
2.1 通道操作
下面是一些常用的通道操作:
- 获取通道:FileChannel channel = new FileInputStream("file.txt").getChannel();
- 向通道写入数据:channel.write(buffer);
- 从通道读取数据:channel.read(buffer);
- 关闭通道:channel.close();
3. 选择器(Selector)及其操作
选择器(Selector)用于处理多个通道的IO操作,以便实现高效地处理大量连接和请求。
3.1 选择器操作
以下是一些常用的选择器操作:
- 打开选择器:Selector selector = Selector.open();
- 向选择器注册通道:channel.register(selector, SelectionKey.OP_READ);
- 选择已经准备好IO操作的通道:int readyChannels = selector.select();
- 处理已经准备好IO操作的通道:Set<SelectionKey> selectedKeys = selector.selectedKeys();
4. NIO示例:服务端
下面是一个简单的Java NIO服务端示例代码。该服务端接收客户端的连接,并返回客户端发送的数据。我们可以使用telnet测试该服务端的运行效果。
public class NIOServer {
public static void main(String[] args) throws Exception {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress("localhost", 8888));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
int readyChannels = selector.select();
if (readyChannels <= 0) {
continue;
}
Set<SelectionKey> selectionKeys = selector.selectedKeys();
for (SelectionKey selectionKey : selectionKeys) {
if (selectionKey.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
SocketChannel socketChannel = server.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (selectionKey.isReadable()) {
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
StringBuilder sb = new StringBuilder();
while (socketChannel.read(buffer) > 0) {
buffer.flip();
sb.append(Charset.defaultCharset().decode(buffer));
buffer.clear();
}
System.out.println("Received message: " + sb.toString());
}
}
selectionKeys.clear();
}
}
}
5. NIO示例:客户端
下面是一个简单的Java NIO客户端示例代码。该客户端连接到上述服务端,并发送数据给服务端。
public class NIOClient {
public static void main(String[] args) throws Exception {
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8888));
socketChannel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("hello world".getBytes());
buffer.flip();
socketChannel.write(buffer);
buffer.clear();
socketChannel.close();
}
}
以上是Java NIO的详解和示例代码,希望对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java NIO 详解 - Python技术站