Java NIO:NIO概述
http://www.cnblogs.com/dolphin0520/p/3919162.html
在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。本文下面分别从Java NIO的几个基础概念介绍起。
以下是本文的目录大纲:
一.NIO中的几个基础概念
二.Channel
三.Buffer
四.Selector
若有不正之处,请多多谅解并欢迎批评指正。
请尊重作者劳动成果,转载请标明原文链接:
http://www.cnblogs.com/dolphin0520/p/3919162.html
一.NIO中的几个基础概念
在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。
首先从Channel说起吧,通道,顾名思义,就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:
1
2
3
4
5
6
7
8
9
|
public class Test {
public static void main(String[] args) throws IOException {
File file = new File( "data.txt" );
InputStream inputStream = new FileInputStream(file);
byte [] bytes = new byte [ 1024 ];
inputStream.read(bytes);
inputStream.close();
}
} |
这里的InputStream实际上就是为读取文件提供一个通道的。
因此可以将NIO 中的Channel同传统IO中的Stream来类比,但是要注意,传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。而Channel是双向的,既可用来进行读操作,又可用来进行写操作。
Buffer(缓冲区),是NIO中非常重要的一个东西,在NIO中所有数据的读和写都离不开Buffer。比如上面的一段代码中,读取的数据时放在byte数组当中,而在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。
下面介绍一下NIO中最核心的一个东西:Selector。可以说它是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。
比如看下面的这个例子:
用单线程处理一个Selector,然后通过Selector.select()方法来获取到达事件,在获取了到达事件之后,就可以逐个地对这些事件进行响应处理。
二.Channel
在前面已经提到,Channel和传统IO中的Stream很相似。虽然很相似,但是有很大的区别,主要区别为:通道是双向的,通过一个Channel既可以进行读,也可以进行写;而Stream只能进行单向操作,通过一个Stream只能进行读或者写;
以下是常用的几种通道:
- FileChannel
- SocketChanel
- ServerSocketChannel
- DatagramChannel
通过使用FileChannel可以从文件读或者向文件写入数据;通过SocketChannel,以TCP来向网络连接的两端读写数据;通过ServerSocketChanel能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的SocketChannel来进行数据读写;通过DatagramChannel,以UDP协议来向网络连接的两端读写数据。
下面给出通过FileChannel来向文件中写入数据的一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Test {
public static void main(String[] args) throws IOException {
File file = new File( "data.txt" );
FileOutputStream outputStream = new FileOutputStream(file);
FileChannel channel = outputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
String string = "java nio" ;
buffer.put(string.getBytes());
buffer.flip(); //此处必须要调用buffer的flip方法
channel.write(buffer);
channel.close();
outputStream.close();
}
} |
通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio",注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容,至于具体原因将在下篇博文中具体讲述Buffer的用法时阐述。
三.Buffer
Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了:
上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。
在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:
- ByteBuffer
- IntBuffer
- CharBuffer
- LongBuffer
- DoubleBuffer
- FloatBuffer
- ShortBuffer
如果是对于文件读写,上面几种Buffer都可能会用到。但是对于网络读写来说,用的最多的是ByteBuffer。
关于Buffer的具体使用以及它的limit、posiion和capacity这几个属性的理解在下一篇文章中讲述。
四.Selector
Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。
与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。
关于Selector类的具体使用将在后续文章中阐述。
参考资料:
http://blog.csdn.net/wuxianglong/article/details/6604817
http://www.360doc.com/content/12/0515/11/1542811_211144310.shtml
http://www.iteye.com/topic/834447
http://weixiaolu.iteye.com/blog/1479656
相关推荐
因此,RFID标准化组织EPCglobal在2007年推出了底层读写器协议LLRP(Low Level Reader Protocol),它为读写器和其控制器提供了标准的网络接口,极大地提高了RFID应用系统的构建效率。借助于开源的RFID中间件平台...
一种超高频射频识别读写器天线的设计,邵明媚,李秀萍,本文提出了一款工作于超高频的宽带贴片射频识别读写器天线,天线采用双层FR-4介质板结构,底层馈电网络通过同轴线对上层圆形贴片��
本文主要设计了一个缝隙耦合的微带天线...底层也是介质层,介质层上是接地层,介质层下是馈电。它们的参数设置如下:介质层厚度都为1.6mm;它们的相对介电常数都为4.4;为了增加天线的带宽,这里选择空气层的厚度为25mm。
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...
C++网络编程案例详解 流套接字(SOCK_STREAM) TCP:面向连接的、可靠的 通信连接必须显式建立 适合传输大量的数据,不支持广播和多播 数据报套接字(SOCK_DGRAM) UDP:无连接的、不可靠的 通信...
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...
该模型把所有单位的信息分为3个层次存 储,最底层是单个的数据对象(Data),上一层是相应的公司数据集合(CompanyData,C D),最上层是根据利益冲突分类的COI类(ConflictofInterest,COI),每个公司只能属 于一个COI....
这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务...
这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务...
syncookie、读写分析、NFS实现框架、网络新特性、skb核心操作、HASH算法、过滤框架Nftables、接 收框架、页缓存PageCache、Netfilter框架、处理器架构、中断机制、malloc、free实现原理、内存的 动态、缺页中断、...
I/O流技术提供了丰富的功能和特性,使得开发者能够轻松地进行文件的读写、网络通信、处理数据等操作。另外,Java还提供了一些高级的流类,如缓冲流、对象流、数据流等,它们在底层字节流和字符流的基础上提供了更多...