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)
==================