码迷,mamicode.com
首页 > 编程语言 > 详细

Java NIO (一)

时间:2015-09-22 13:09:45      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

Java NIO

核心部分(简单来说):

    Channels (通道)

    Buffers    (缓冲区)

    Selectors    (选择器)

-----------------------------------------------------

Channel实现:

                        FileChannel  (从文件中读写数据)

                        DatagramChannel    (能通过UDP读写网络中的数据 )

                        SocketChannel    (能通过TCP读写网络中的数据)                        

                        ServerSocketChannel    (可以监听新进入的TCP连接,像WEB服务器一样,对每一个新连接都建立一个SocketChannel )

-----------------------------------------------------

Buffer实现:

对应七种基本类型的:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer

以及 MappedByteBuffer

-----------------------------------------------------

Selector : 选择器允许单线程中处理多个Channel

-----------------------------------------------------

NIO与传统IO的不同点

1:通道既可以读取数据、也可以写入数据到通道。

2:通道可以异步读写数据

3:通道中的数据总是要先读取到一个Buffer,或总要从一个Buffer中写入

public static void main(String[] args) throws IOException {
		RandomAccessFile aFile = new RandomAccessFile("d:/缴费商户记录.txt","rw");
		FileChannel inChannel = aFile.getChannel();
		ByteBuffer buff = ByteBuffer.allocate(64); //设定缓冲区大小
		
		int byteRead = 0;//inChannel.read(buff);  从通道读取数据到缓冲区
		
		while(byteRead != -1){
			//System.out.println("Read---------->" + byteRead);
			buff.flip(); //反转。切换读/写模式
			while(buff.hasRemaining()){ //检测缓冲区
				System.out.print((char) buff.get());  //取数据
			}
			/**clear()方法会清空整个缓冲区**/
		  //buff.clear();
			
			/**compact()方法只会清除已经读过的数据。
				任何未读的数据都被移到缓冲区的起始处,
				新写入的数据将放到缓冲区未读数据的后面。**/
			buff.compact();
			byteRead = inChannel.read(buff);
		}
		aFile.close();
	}


buffer与channel进行交互:

    Channel读取数据到Buffer中;        

    将Buffer的数据写入到Channel;

Buffer的基本用法——四个步骤:

    1:写入数据到Buffer。

    2:调用flip()方法,反转读/写模式。

    3:从Buffer中读取数据。

    4:调用clear() 或者 compact()方法。

a:在向Buffer写入数据时,Buffer会记录写入了多少数据,一旦要读取这些数据,需要通过flip()方法,将Buffer从写模式谢欢到读模式。

b:一旦读完所有数据,就需要清空缓冲区,让它可以再次读写。

Buffer的工作原理:

缓冲区本质上市一块可以读写数据的内存,它被包装成NIO的Buffer对象。

三个属性:  capacity、position、limit

capacity:总容量,也就是获取缓冲区时设定的值

position:当前读或写的位置。

position和limit的值取决于buffer处于读模式还是写模式

在写数据到buffer时,position表示当前的位置,初始为0,当一个数据写入到buffer后,position会向前移动到下一个可以插入数据的位置。position最大可为 :capacity - 1

读取数据时:从写模式切换到读模式,position会被置为0,读取将从position的位置开始,读取后position向前移动到下一个位置。   

limit : 在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。 写模式下,limit等于Buffer的capacity。

当切换Buffer到读模式时, limit表示你最多能读到多少数据。因此,当切换Buffer到读模式时,limit会被设置成写模式下的position值。换句话说,你能读到之前写入的所有数据(limit被设置成已写数据的数量,这个值在写模式下就是position)

==================


Java NIO (一)

标签:

原文地址:http://my.oschina.net/dlam/blog/509519

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!