你的位置:首页 > 软件开发 > Java > Java NIO Channel通道

Java NIO Channel通道

发布时间:2017-11-24 14:00:18
NIO包含下面几个核心的组件:ChannelsBuffersSelectors通道和缓冲区(Channels and Buffers)通常来说NIO中的所有IO都是从Channel开始的。Channel和流有点类似。通过Channel,我们即可以从Channel把数据读取到Buf ...

Java NIO Channel通道

NIO包含下面几个核心的组件:

  • Channels
  • Buffers
  • Selectors

通道和缓冲区(Channels and Buffers)

通常来说NIO中的所有IO都是从Channel开始的。Channel和流有点类似。通过Channel,我们即可以从Channel把数据读取到Buffer中,也可以把数据冲Buffer写入到Channel,下图是一个示意图:

Java NIO Channel通道

Channel的实现及demo

  • FileChannel:用于文件的数据读写。
  • DatagramChannel:用于UDP的数据读写。
  • SocketChannel:用于TCP的数据读写。
  • ServerSocketChannel:允许我们监听TCP链接请求,每个请求会创建会一个SocketChannel.
 public static void main(String[] args) {  try {   FileInputStream aFile = new FileInputStream("test.txt");   //获取通道   FileChannel inChannel = aFile.getChannel();   //Buffer的大小   ByteBuffer buf = ByteBuffer.allocate(1024);   try {    //从通道中读取到Buffer中    int bytesRead = inChannel.read(buf);    while (bytesRead != -1) {     System.out.println("Read " + bytesRead);     //切换到读     buf.flip();     while (buf.hasRemaining()) {      System.out.print((char) buf.get());     }     //清空Buffer     buf.clear();     bytesRead = inChannel.read(buf);    }    aFile.close();   } catch (IOException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  } catch (FileNotFoundException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } }

 相关名词:

容量(capacity):Buffer容量,不能改变,一旦buffer写满了就需要清空已读数据以便下次继续写入新的数据。

2、读写位置(postion):下一个值将在此进行读写。当写入数据到Buffer的时候需要中一个确定的位置开始,默认初始化时这个位置position为0,一旦写入了数据比如一个字节,整形数据,那么position的值就会指向数据之后的一个单元,position最大可以到capacity-1.当从Buffer读取数据时,也需要从一个确定的位置开始。buffer从写入模式变为读取模式时,position会归零,每次读取后,position向后移动。

3、界限(limit):容量界限,初始=容量;在写模式,limit的含义是我们所能写入的最大数据量。它等同于buffer的容量。

      一旦切换到读模式,limit则代表我们所能读取的最大数据量,他的值等同于写模式下position的位置。

      数据读取的上限时buffer中已有的数据,也就是limit的位置(原position所指的位置)。

4、标记(mark):用于重复一个读入或写出操作

这些值满足一下条件

0<=标记<=位置<=界限<=容量

 flip():

 public final Buffer flip() {  limit = position;//界限=位置  position = 0;//位置=0  mark = -1;  return this; }
hasRemaining():
public final boolean hasRemaining() {  return position < limit; }
clear():
 public final Buffer clear() {  position = 0;  limit = capacity;  mark = -1;  return this; }

当写入数据到buffer中时,buffer会记录已经写入的数据大小。当需要读数据时,通过flip()方法把buffer从写模式调整为读模式;在读模式下,可以读取所有已经写入的数据。

当读取完数据后,需要清空buffer,以满足后续写入操作。清空buffer有两种方式:调用clear()或compact()方法。clear会清空整个buffer,compact则只清空已读取的数据,未被读取的数据会被移动到buffer的开始位置,写入位置则近跟着未读数据之后。

代码流程:

Java NIO Channel通道

 

 

 

 

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Java NIO Channel通道

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。