文山微网站建设,用dedecms做的网站,met metro wordpress,wordpress 自定义参数Java 中的 IO#xff08;输入/输出#xff09;和 NIO#xff08;新输入/输出#xff09;都是处理输入和输出操作的方式#xff0c;它们的主要区别在于如何处理数据的读写。 阻塞与非阻塞: IO是阻塞的#xff0c;这意味着当一个线程调用read()或write()时#xff0c;该线…Java 中的 IO输入/输出和 NIO新输入/输出都是处理输入和输出操作的方式它们的主要区别在于如何处理数据的读写。 阻塞与非阻塞: IO是阻塞的这意味着当一个线程调用read()或write()时该线程被阻塞直到有一些数据被读取或写入。该线程在此期间不能再做任何事情了。NIO则可以非阻塞地进行读写操作。当线程从通道读取数据到缓冲区或从缓冲区写入通道时线程可以同时进行其他任务。线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作所以一个线程现在可以管理多个输入和输出通道channel。 选择器/多路复用器: NIO有选择器的概念选择器能够监控多个开放的通道检查哪个通道准备好了进行读写。 这种模式使得一个单独的线程可以管理多个通道。 数据处理: IO面向流(Stream Oriented)即一个流必须从一个地方移动到另一个地方。它能够持续、顺序地处理数据。但不能随机访问数据每次只能从头开始。NIO面向缓冲(Buffer Oriented)这意味着数据是直接读到或写自一个缓冲区的。可以随时回到缓冲区重新读取数据但这在IO操作中是不可能的。
这就是IO和NIO的主要区别。 重点讲一下选择器怎么运行的
NIO通过使用Selector选择器来监控通道。选择器是Java NIO提供的一个对象它可以注册到多个通道上监听通道中发生的事件操作如何就绪。接下来的段落会解释NIO是如何使用选择器来监控通道的。
首先你需要创建一个Selector对象
Selector selector Selector.open();
然后你可以将一个或多个通道通常是ServerSocketChannel或SocketChannel注册到这个Selector
channel.configureBlocking(false);
SelectionKey key channel.register(selector, SelectionKey.OP_READ);
上面的代码首先将通道设置非阻塞模式然后将通道注册到选择器上关注或说订阅读就绪事件。OP_READ是一个常量表示读操作就绪的事件。
现在已经设置好了通道和选择器接下来就可以使用选择器来轮询哪个注册的通道准备好了某个操作。下面就是一个基本的选择循环
while (true) {int readyChannels selector.select();if(readyChannels 0) continue;SetSelectionKey selectedKeys selector.selectedKeys();IteratorSelectionKey keyIterator selectedKeys.iterator();while(keyIterator.hasNext()) {SelectionKey key keyIterator.next();if(key.isReadable()) {// a channel is ready for reading} else if (key.isWritable()) {// a channel is ready for writing}keyIterator.remove();}
}
在上述代码中selector.select()阻塞等待直至至少有一个注册的通道就绪。接着使用selectedKeys()方法来访问就绪的通道这个方法返回一个SelectionKey对象的集合每一个SelectionKey对象都代表了一个注册到这个选择器的、已经就绪的通道。
通过isReadable()和isWritable()方法你可以检查通道的读或写事件是否已经就绪。如果这些方法返回true那么你就可以开始进行读或写操作了。
以上就是Java NIO如何使用选择器来监控多个通道的基本过程。请注意这只是一个基础例子真实的使用中还需要处理更多问题例如处理异常配置通道和选择器等。