java nio单线程6_Java NIO (一)

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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值