zoukankan      html  css  js  c++  java
  • Java NIO Channel通道

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

    • Channels
    • Buffers
    • Selectors

    通道和缓冲区(Channels and Buffers)

    通常来说NIO中的所有IO都是从Channel开始的。Channel和流有点类似。通过Channel,我们即可以从Channel把数据读取到Buffer中,也可以把数据冲Buffer写入到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();
            }
        }

     相关名词:

    1、容量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的开始位置,写入位置则近跟着未读数据之后。

    代码流程:以图示的方式展示上述代码的流程

     
    作者:starryfeiii
    出处:http://www.cnblogs.com/feiii/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,原文链接否则保留追究法律责任的权利。
  • 相关阅读:
    Picture
    wolf and rabbit
    十进制转换为二进制(一直不会算的)
    各种排序
    折线分割平面
    字母数
    1001
    Primes
    大数的减法神秘数
    转: Windows Internet WinINet 学习笔记(2)
  • 原文地址:https://www.cnblogs.com/feiii/p/7890159.html
Copyright © 2011-2022 走看看