Java IO--Channel

本文介绍了Java NIO中的Channel,Channel是一个双向通道,可以用于读写数据,与单向的流不同。它支持异步读写,且可以与Buffer配合处理数据。主要的Channel子类包括FileChannel、DatagramChannel、ServerSocketChannel和SocketChannel等,适用于不同的IO操作。文章详细阐述了Channel的概念模型、分类、继承体系以及关键API,如isOpen()、close()、SelectableChannel等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

Channel是一个通道,可以通过它实现数据的读取和写入,它和之前讨论的输入、输出流有很大区别,通道与流的不同之处在于通道是双向的,流只是单向的,流区分输入流和输出流,一个流只能是输入流或者输出流,不能复用。通道解决了复用问题,它既可以处理输入数据,也可以处理输出数据,并且这两者可以同时进行,现在的底层操作系统都是全双工模式,可以支持读写同时操作。

channel封装了对数据源的操作,通过channel我们可以处理数据源,但是又不必关心数据源的具体物理结构。这个数据源可以是不同类型的,比如一个文件描述符、程序组件的打开连接或者是一个网络socket,在大多数应用中,数据源与channel是一一对应的,channel用于在字节缓冲区和数据源直接传输数据。

二、概念模型

channel是一个对象,可以通过它读写数据。NIO提供的channel和原IO提供的输入输出力比较,通道就像外观模式中的外观接口,由channel对外部数据源进行映射和包装,然后将数据交由buffer处理。channel自己并不进行数据处理,读取数据时,channel将数据源写入buffer,然后由buffer获取数据在进行其他操作;在写入数据时,也是先把数据源写入buffer中,然后再通过channel将数据写入目标位置。

NIO的通道类似流,但是跟流又不同,他们的区别如下:
    1、通道既可以读取数据,也可以写入数据,流只是单向的;
    2、通道支持异步读写,流只支持同步阻塞读写;
    3、通道不能产生数据,也不会处理数据,都是通过buffer进行处理的;
    通道的数据处理模型如下:

三、分类
    channel的主要实现子类如下图所示:


    这些channel主要分为几下部分:
    1、文件操作相关的FileChannel;
    2、UDP协议相关的DatagramChannel;
    3、TCP协议相关的ServerSocketChannel、SocketChannel;
    4、SCTP协议相关的SctpChannel、SctpMultiChannel、SctpServerChannel;
    5、管道操作相关的SinkChannel、SourceChannel;

四、channel继承体系
    SocketChannel继承体系如下图所示:


    ServerSocketChannel继承体系如下图所示:


    DatagramChannel继承体系如下图所示:


    FileChannel继承体系如下图所示:

五、channel提供的API

与缓冲区不同,通道API主要由接口定义,不同操作系统上通道的实现会有很大差异,所以通道API仅仅描述接口可以做什么,但是具体如何实现,需要由操作系统提供。通道的实现一般由本地操作系统本地代码提供,这样我们就可以以一种受控并且可移植的方式来访问底层io服务。

通过之前的接口继承体系分析可知,不同通道的功能不尽相同,但是它们可提供的基础功能是类似的,因为它们继承了相同的接口,通用接口或抽象类有AutoCloseable、Closeable、Channel、InterruptibleChannel、AbstractInterruptibleChannel、SelectableChannel、AbstractSelectableChannel、NetworkChannel等。
    1、通用接口提供的API
    AutoCloseable 提供的接口如下:

public interface AutoCloseable {
     void close() throws Exception;
}


    在jdk1.7之前,我们通常在finally块中释放资源,finally中释放资源有如下问题:
    1)、需要手动编写释放逻辑;
    2)、可能会忘记关闭,造成资源浪费;
    3)、代码逻辑冗长;
    实现AutoCloseable接口之后,只需要将需要释放资源的语句定义放在try块中即可自动释放。
    Closeable提供的接口如下:

public interface Closeable extends AutoCloseable {

    public void close() throws IOException;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值