通道是Java NIO中数据流的媒介,它是双向的,既可以用来读取数据,也可以用来写入数据。通道的主要优点在于它们是非阻塞的,这意味着一个线程可以管理多个通道,当某个通道上没有事件发生时,线程不会被阻塞,而是可以去处理其他任务。主要的通道类型包括: FileChannel:用于文件的读写操作,可以用于将数据从缓冲区写入文...
NIO的读写函数可以立刻返回,这就给了我们不开线程利用CPU的最好机会:如果一个连接不能读写(socket.read()返回0或者socket.write()返回0),我们可以把这件事记下来,记录的方式通常是在Selector上注册标记位,然后切换到其它就绪的连接(channel)继续进行读写。 下面具体看下如何利用事件模型单线程处理所有I/O请求: ...
NIO并没有完全屏蔽平台差异,它仍然是基于各个操作系统的I/O系统实现的,差异仍然存在。使用NIO做网络编程构建事件驱动模型并不容易,陷阱重重。 推荐大家使用成熟的NIO框架,如Netty,MINA等。解决了很多NIO的陷阱,并屏蔽了操作系统的差异,有较好的性能和编程模型。 总结 最后总结一下到底NIO给我们带来了些什么: 事件驱动...
例如,在Linux上,它通常使用epoll机制,而在Windows上,它可能依赖于IOCP(I/O Completion Ports)。5.NIO服务器端交互流程:启动线程:服务器端启动一个线程;选择器(Selector)遍历通道(Channel):线程通过选择器不同的遍历各个通道,如果发现有客户端对应的通道有网络请求,那么开始处理该通道相关业务逻辑;通道(...
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中(双向操作)。NIO可以使用非阻塞模式。 NIO概述# NIO在处理文件时会将文件的一段区域直接映射到内存中,这样访问文件时就可以像访问内存一样,比传统的输入输出要快很...
importjava.nio.ByteBuffer;publicclassBufferExample{publicstaticvoidmain(String[]args){// 创建一个容量为1024字节的缓冲区ByteBufferbuffer=ByteBuffer.allocate(1024);// 向缓冲区中写入数据buffer.put("Hello, NIO".getBytes());// 切换到读模式buffer.flip();byte[]data=newbyte[buffer.limit()];// 从缓冲...
AIO 是 java.nio.channels.Asynchronou* 下面的包的调用 AIO 是异步的实现,底层方面,在 Linux 使用 JDK 自建线程池,在 Windows 下面使用 IOCP,不过据说还是有些 bug 应用实现 Netty Netty 默认是使用 NIO 底层 (同步非阻塞)。 但是在应用层面上,使用 Eventloop 的异步实现,即用一个比较小的线程池同时处理用户...
Linux 上依赖于 epoll(http://hg.openjdk.java.net/jdk/jdk/file/d8327f838b88/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java)。 Windows 上 NIO2(AIO)模式则是依赖于 iocp(http://hg.openjdk.java.net/jdk/jdk/file/d8327f838b88/src/java.base/windows/classes/sun/nio/ch/Ioc...
JAVA中的BIO、NIO、AIO BIO 同步阻塞,传统io方式。 适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。 NIO 同步非阻塞,jdk4开始支持。 适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器。 AIO 异步非阻塞,jdk7开始支持。
NIO(Non-Blocking-IO)同步非阻塞模型,从字面意思上来说就是:调用read()函数的线程并不会阻塞,而是可以正常运行,如下: 当应用程序中发起IO调用后,内核并不阻塞当前线程,而是立马返回一个“数据未就绪”的信息给应用程序,而应用程序这边则一直反复轮询去问内核:数据有没有准备好?直到最终数据准备好了之后,内核返回“...