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