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。异步关闭。

  • 相关阅读:
    电信的星空极速客户端软件强制安装策略升级了
    CSS 控件适配器工具包对事件处理的 Bug 以及修正办法
    IronPython 源码剖析系列(1):IronPython 编译器
    对 CSS 控件适配器处理事件的 Bug 进一步修正
    明天去长春出差。。。
    Windows 系统右键菜单假死问题解决一例
    使用 Anthem.NET 的常见回调(Callback)处理方式小结
    TreeViewVisitor: 一个快捷访问 TreeView 控件节点的帮助类
    ASP.NET Web开发框架之六 数据库文档方法,工具和实践
    推荐功能强大的ORM Profiler,ORM问题追踪的利器
  • 原文地址:https://www.cnblogs.com/niejunlei/p/5996001.html
Copyright © 2011-2022 走看看