zoukankan      html  css  js  c++  java
  • Java NIO之Channel和Buffer学习记录

    声明:本文是对《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之间的元素)
    	 * 			
    	 * 
    	 * 
    	 * 
    	 * 
    	 * 
    	 * 
    	 * 
    	 */
    
    }
    

    `

  • 相关阅读:
    201621123034 《Java程序设计》第3周学习总结
    java 例子
    201621123034 《Java程序设计》第4周学习总结
    Java暑期作业
    201621123034 《Java程序设计》第2周学习总结
    WEB标准了解
    CSS盒子模型
    Caused by: Caught exception while loading file strutsdefault.xml [unknown location]问题
    CSS中padding和margin以及用法
    idea开发maven项目jsp更改无法实时更新问题
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608435.html
Copyright © 2011-2022 走看看