前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA NIO Channel

JAVA NIO Channel

作者头像
WindWant
发布2020-09-11 10:55:57
4650
发布2020-09-11 10:55:57
举报
文章被收录于专栏:后端码事

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:如下:

代码语言:javascript
复制
/**
     * 基于基本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。异步关闭。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档