Java NIO 概述

本文详细介绍了Java NIO的核心组件,包括Channel的双向操作、Buffer的缓冲管理以及Selector的事件处理。通过对比Netty、Mina、xSocket和Grizzly,探讨了NIO在高性能网络编程中的应用和框架间的异同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

	现在使用NIO的场景越来越多,譬如 Netty、Mina、xSocket、Grizzly等优秀框架。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分
技能,而是一个必备技能。

	java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)
提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

	Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象
。 支持锁和内存映射文件的文件访问接口。 提供多路(non-blocking) 非阻塞式的高伸缩性网络I/O 。

2、Java NIO框架的比较

	不管是什么NIO框架。本身其实都是对Java底层的一种在封装。封装一套更简便,更易于扩展的一套东西以方便开发者使用。所以性能上
也许会有所差异,但是绝对没有java和C++之间这么多。(代码写的太烂的除外,不过想要使用java写出很烂的代码也比较困难。)这些框架在
性能方面差别不会超过1%。


	Mina和Netty,这两个NIO框架的创作者是同一个人Trustin Lee (韩国人)。GitHub主页地址 :https://github.com/trustin。
尽管创作者现在已经不专注与开发了。但是框架的后续开发和继承,可以说都是符合最开始的设定的。两个框架的架构设计思路基本一致。

	Netty从某种程度上讲是Mina的延伸和扩展。解决了一些Mina上的设计缺陷,也优化了一下Mina上面的设计理念。
	
	另一方面Netty相比较Mina更容易学习。API更简单。详细的范例源码和API文档。更活跃的论坛和社区。更高的代码更新维护速度。
	
	xSocket:是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面
。(只是对Java的NIO做了最简单的封装,以便于开发使用。)

	Grizzly : 是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程
的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。

3、三大核心

	NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择区)。传统IO基于字节流和字符流进行操作,而NIO基于
Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个
通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

	虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和
FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在后续课件中讲到。

3.1 Channel

	首先说一下Channel,国内大多翻译成“通道”。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:
InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。

	NIO中的Channel的主要实现有:
		FileChannel
		DatagramChannel
		SocketChannel
		ServerSocketChannel
	这里看名字就可以猜出个所以然来:分别可以对应文件IO、UDP和TCP(Server和Client)。
	
	与这些类一起的有一些有趣的接口,但为简单起见,尽量在概述中不提到它们。在其他课件中与它们相关的地方会进行解释。
	
	基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到
Channel中。这里有个图示:

在这里插入图片描述

3.2 Buffer

	NIO中的关键Buffer实现有:
		ByteBuffer
		CharBuffer
		DoubleBuffer
		FloatBuffer
		IntBuffer
		LongBuffer
		ShortBuffer
	分别对应基本数据类型: byte, char, double, float, int, long, short。当然NIO中还有MappedByteBuffer, HeapByteBuffer
, DirectByteBuffer等这里先不进行陈述。

3.3 Selector

	Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便
。例如,在一个聊天服务器中。
	
	这是在一个单线程中使用一个Selector处理3个Channel的图示:

在这里插入图片描述

	要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦
这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

4、扩展内容

网络的一些大神的文章是关于这些NIO框架的。有兴趣的大家可以看看:
	Netty&Mina : http://www.kankanews.com/ICkengine/archives/82271.shtml   对比的是Netty3 和Mina2
	
	Grizzly和Netty以及Mina简单性能对:http://javatar.iteye.com/blog/1126171 

y3 和Mina2

	Grizzly和Netty以及Mina简单性能对:http://javatar.iteye.com/blog/1126171 
	
	tomcat、netty以及nodejs的helloworld性能对比 : http://my.oschina.net/lifeofpi/blog/120210
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JTZ001

你的鼓励是我创作的最大动力?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值