zoukankan      html  css  js  c++  java
  • JAVA NIO Channel

    Basic: 

    多数通道都是链接到开发的文件描述符的。Channel类提供维持平台独立性的抽象过程。

    通道是一种途径,访问和操作操作系统,缓冲区是数据操作点:

    Channel类继承结构图:

    通过API主要由接口指定(面向接口),通道实现经常要操作本地操作系统的代码,所以不同操作系统的实现会有根本的差异性,通道接口允许以可控且可抑制的方式来访问底层IO.

     

    IO广义两大类:

    File IO、Stream IO 《==》通道两大类:FileChannel(文件通道)、SocketChannel-ServerSocketChannel-DatagramChannel(套接字通道)。

    通道的单向和双向:

    实现ReadableByteChannel read()方法《==》实现WritableByteChannel write()方法。

    ByteChannle:

    只是一个提供继承便捷的借口。简化类定义的语法糖。所有通道基本都是双向的。

    通道会连接一个特定的IO服务,且通道实例性能受所连接的IO服务的特征限制。 

    ByteChannel 的read()和write()方法是用ByteBuffer作为参数,返回已传输的字节数,比缓冲区的字节数少或者可能为0,因为一次输出不完,缓冲去的位置会与已传输字节相同数量的前移,如果只进行了部分传输,缓冲区可以被重新提交给通道,并从上次中断的地方继续传输(基于Buffer的positon属性,继续操作postion到limit的数据)。该过程重复进行,直到Buffer.hasRemaining()方法返回false:如下:

     

    /**
         * 基于基本channel buffer的文件复制操作
         */
        public static void fileTransferByNormal() {
            try {
                RandomAccessFile afile = new RandomAccessFile("hello.txt", "rw");
                RandomAccessFile bfile = new RandomAccessFile("hehe.txt", "rw");
                FileChannel ac = afile.getChannel();
                FileChannel bc = bfile.getChannel();
    
                ByteBuffer bf = ByteBuffer.allocateDirect(16 * 1024);
                while (ac.read(bf) != -1) {
                    bf.flip();
                    while (bf.hasRemaining()) {
                        bc.write(bf);
                    }
                    bf.clear();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    Blocking Nonblocking:非阻塞模式不会让调用的线程休眠,要么请求立即完成,或者返回误操作。Stream-oriented可以设置nonblocking。

    Socket Channel 继承自SelectableChannel=》Selectors=》多路复用。(非阻塞IO)。

    通道关闭:

    通道不能被重复利用,打开的通道代表与一个特定IO服务的特定链接并封装该链接的状态,通道关闭则链接丢失。 

    通道上的多次close(),无影响。

    如果一个线程在一个通道上被阻塞同时被中断,则该通道将被关闭,线程抛出ClosedByInterruptException异常。

    一个线程的interrupt status被设置,且该线程视图访问一个通道,那么这个通道会被关闭,并抛出ClosedByInterruptException异常。

    通道上休眠线程的中断区别于selectors上的休眠线程的中断。

    实现InterruptableChannel的Channel可以在任何时候被关闭,同时通道上的休眠线程会被唤醒并接收到一个AsynchronousInterruptedException。异步关闭。

  • 相关阅读:
    单源最短路——SPFA算法(Bellman-Ford算法队列优化)
    A Compatible Pair
    欧拉函数知识点总结及欧拉函数打表代码(数论)
    Fafa and the Gates(模拟)
    C语言--链表基础模板
    路由器如何设置上网(TP-LINK)
    学员成绩管理系统
    Bad Cowtractors(最大生成树)
    Agri-Net(最小生成树)
    Median Weight Bead(最短路—floyed传递闭包)
  • 原文地址:https://www.cnblogs.com/niejunlei/p/5996001.html
Copyright © 2011-2022 走看看