java的io和nio的区别,和Selector机制实现多路复用 您所在的位置:网站首页 java中的read一次读几个字节 java的io和nio的区别,和Selector机制实现多路复用

java的io和nio的区别,和Selector机制实现多路复用

2023-05-19 11:11| 来源: 网络整理| 查看: 265

目录

Java中的IO(Input/Output)和NIO(New Input/Output)都是用于处理输入和输出的库,但它们之间存在明显的区别。

Selector机制实现多路复用的过程如下:

1. 打开Selector

2. 注册通道

3. 选择事件

4. 处理事件

5. 注销通道

Java中的IO(Input/Output)和NIO(New Input/Output)都是用于处理输入和输出的库,但它们之间存在明显的区别。

1. IO是面向流(Stream)的,而NIO是面向块(Buffer)的。IO将所有的数据处理视为一系列字节和字符流,缺点是每次读取都要从磁盘上读取,效率较低。而NIO使用块缓存来处理输入/输出,数据块被读入一个缓冲区,处理器进行处理,当数据就绪后再写入到磁盘或网络通道中,一次读取数据块的效率比一次读取单个字符或字节更快。

2. IO是阻塞的模式,NIO支持非阻塞的模式。IO的读取和写入都是阻塞操作,当一个线程读取数据或者等待写入完成时,线程被阻塞了,直到操作完成。NIO提供了非阻塞I/O操作来实现异步处理,可以同时处理多个连接,使得一个线程可以服务多个客户端。

3. IO在处理原始数据时性能较好,但在网络操作、并发连接处理等方面表现欠佳。而NIO在网络操作和并发连接处理方面表现出色,因此适用于高并发场景。

综上,从处理大数据和高并发的角度来看,NIO更加适合大规模应用。但对于简单的小数据处理,IO更快,使用更为方便。

NIO中实现多路复用(Multiplexing)的方式是通过Selector机制来实现的。Selector对象提供了一种可以注册和注销IO事件,以及等待注册事件并处理已经就绪事件的能力,这些事件包括输入、输出、连接和接受的操作。

Selector机制实现多路复用的过程如下:

1. 打开Selector

使用`Selector selector = Selector.open()`方法打开一个Selector对象,该对象管理着注册的所有通道,等待通道上发生的事件。

2. 注册通道

将需要注册的通道(例如ServerSocketChannel,SocketChannel)通过`channel.register(selector, interestSet)`注册到Selector上。

其中interestSet表示注册的通道所关注的事件类型,可选择的事件有:

* SelectionKey.OP_READ: 可读事件

* SelectionKey.OP_WRITE: 可写事件

* SelectionKey.OP_CONNECT: 连接事件

* SelectionKey.OP_ACCEPT: 接受连接事件

3. 选择事件

调用Selector的`select()`方法,等待所注册通道中的事件发生。返回值表示已经就绪的事件数量。

4. 处理事件

Selector.select()方法返回后,可以调用Selector的selectedKeys()方法来获得所有已经就绪的事件,并进行相应的处理。例如可以对已经连接的Socket通道进行读取或写入等操作。处理完毕后,需要使用`selectedKeys.clear()`方法清空已经处理的事件列表。

5. 注销通道

如果不再需要关注某个通道的事件,可以将这个通道从Selector中注销,使用key的cancel()方法进行注销。

这就是NIO多路复用的处理流程。通过使用Selector,一个线程就可以处理多个通道上的事件,大大提高了系统的效率和吞吐量。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有