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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,原文链接否则保留追究法律责任的权利。
  • 相关阅读:
    HDOJ 1846 Brave Game
    并查集模板
    HDU 2102 A计划
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    POJ 1321 棋盘问题
    CF 999 C.Alphabetic Removals
    CF 999 B. Reversing Encryption
    string的基础用法
    51nod 1267 4个数和为0
  • 原文地址:https://www.cnblogs.com/feiii/p/7890159.html
Copyright © 2011-2022 走看看