声明:本文是对《Java NIO系列教程》总结学习,该系列来自于并发编程网,http://ifeve.com/overview/;感谢作者:Jakob Jenkov 译者:airu ,受益匪浅。

public class ReadMe {

	/*
	 * jdk 的nio虽然并不是现在新出的东西,但仍然知之甚少。所以建立这个包进行一下学习和练习。
	 * 
	 * 资料来源:http://ifeve.com/overview/
	 * 
	 * 
	 * 一、	java nio主要组成部分:
	 * 		Channels 
	 * 		
	 * 		Buffers
	 * 
	 * 		Selectors
	 * 		
	 * 		主要有以上三个构成核心API,其他组件是与三个核心组件共同使用的工具。
	 * 		Channel类似于流,数据从Channel读到Buffer里,也可以从buffer写到Channel
	 * 		
	 * 		nio中Channel主要实现:FileChannel 从文件中读写数据, 
	 * 						     DatagramChannel 能通过UDP读写网络中的数据, 
	 * 							 SocketChannel 能通过TCP读写网络中的数据, 
	 * 							 ServerSocketChannel 监听新进来的TCP连接,对每个新进的连接创建一个SocketChannel
	 * 
	 * 		nio中Buffer主要实现: ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer , IntBuffer , LongBuffer ,
	 * 							ShortBuffer 基本类型;
	 * 							MappedByteBuffer 内存映射文件
	 * 		Selector 允许单线程处理多个Channel。
	 * 		
	 * 		
	 * 	二、 Channel
	 * 		通道类似于流,但并不完全相同:
	 * 			1.既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
	 * 			2.通道可以异步读写
	 * 			3.通道中的数据总是要先读到一个buffer,或者总是要从一个buffer中写入。
	 * 
	 * 	三、Buffer
	 * 		使用Buffer读写数据一般遵循以下四个步骤:

				1.写入数据到Buffer
					//这里allocate()的方法是获取一个分配了多大的缓冲区对象
					ByteBuffer buf = ByteBuffer.allocate(48);
					
					//有两种方式写数据到buffer:
					1.int readByte = fileChannel.read(buf);
					
					2.buf.put()将数据放入到buffer
					
				2.调用flip()方法
					buf.flip();//将buffer从写模式变成读模式;在读模式下可以读出之前写入的buffer所有数据
				3.从Buffer中读取数据
					读数据也有两种方式:
						1.buf.get()获取,
						2.读数据到Channel
							int readByte = fileChannel.write(buf);
				4.调用clear()方法或者compact()方法
					clear():清空缓存区
					compact():只清空已经读过的数据。
					任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
	 * 		
	 * 		Buffer原理:
	 * 			三个属性:
	 * 				capacity:
	 * 					缓冲区的大小,一旦写满,只能清空才能继续写。
	 * 
	 * 				position:
	 * 					写模式:position表示当前的位置。初识为0,当一个byte写入buffer时,position向前移动到下一个可插入数据的buffer单元
	 * 						最大值为capacity-1;
	 * 					读模式:当flip方法执行的时候,position重置为0,然后逐渐移动到下一个可读位置。
	 * 
	 * 				limit:
	 * 					写模式:limit=capacity,表示限制最多写入缓冲区多少数据。
	 * 					读模式:最多能读多少数据。因此,limit等于写模式下的position值。因为写入多少,此时最多能读到多少。
	 * 
	 * 			其中,position和limit的含义取决于Buffer处于什么模式。
	 * 		
	 * 		Buffer中的一些重要方法:
	 * 			1.flip():切换写模式到读模式,position置为0,limit设置为之前的position;
	 * 			2.rewind():将position设回0,然后此时可以重读Buffer中的所有数据,limit保持不变,仍然表示能从buffer中读取多少元素
	 * 			3.clear()与compact():
	 * 				读完数据,clear是将position设回0,limit设为capacity.Buffer被清空了,但是数据并未清除。只是标记告诉我们从哪里写数据。
	 * 				有未读完的数据调用clear方法会导致数据被遗忘。
	 * 				如果仍有未读的数据,但是想先写入数据,那么使用compact方法。
	 * 				compact方法讲所有未读的数据拷贝到Buffer的起始位置,将position设到最后一个未读数据元素后面,limit依然是设置成
	 * 				capacity。
	 * 			4.mark()和reset():
	 * 				mark可标记Buffer中一个特定的position,reset可恢复到这个位置。
	 * 			5.equals():
	 * 				1.有相同的类型(byte等);
	 * 				2.Buffer中剩余的byte、char等个数相同;
	 * 				3.Buffer中剩余的byte、char等都相同。
	 * 			6.compareTo():(比较的是剩余元素)
	 * 				1.第一个不相等的元素小于另一个Buffer中对应的元素。
	 * 				2.所有元素都相等,但是第一个buffer比第二个先耗尽。
	 * 				(译注:剩余元素是从 position到limit之间的元素)
	 * 			
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 * 
	 */

}

`

posted on 2017-05-12 16:02  菜码农先生  阅读(84)  评论(0编辑  收藏  举报