JavaNIO-通道01 Channel接口结构

Channel接口总体结构

image

1 Channel父接口

1.1 AutoCloseable 接口

  • AutoCloseable接口用来描述自动关闭,此方法主要与try-with-resources语句结合实现自动关闭任何资源关闭,不支持幂等操作,重复调用可能抛出Exception
public interface AutoCloseable {
    //AutoCloseable接口用来描述自动关闭,此方法主要与try-with-resources语句结合实现自动关闭任何资源关闭,不支持幂等操作,重复调用可能抛出Exception
    void close() throws Exception;
}

1.2 Closeable 接口
  • Closeable接口用来描述手动关闭,此方法主要用作手动关闭IO流,释放系统资源,支持幂等操作。可能抛出IOException异常
public interface Closeable extends AutoCloseable {
   // Closeable接口用来描述手动关闭,此方法主要用作手动关闭IO流,释放系统资源,支持幂等操作。可能抛出IOException异常
    public void close() throws IOException;
}

2 Channel接口

  • Channel接口被称为"通道",用来表示数据到硬件设备、文件、网络套接字的连接通路。

  • 通道可处于打开或关闭这两种状态。一旦通道关闭,任何尝试调用I / O操作将导致抛出ClosedChannelException,通道是否打开可以通过调用其isOpen方法进行测试

public interface Channel extends Closeable {

    /** 判断通道是否打开 **/
    public boolean isOpen();

    /** 关闭通道 **/
    public void close() throws IOException;

}

3 Channel子接口

3.1 WritableByteChannel 接口

  • 一个可以用来写入的通道。可写通道上在一个时间节点只能最多进行一个写操作。如果一个线程在通道上执行写操作 ,任何其他线程试图在该通道进行写操作都将被阻止,直到第一个写操作完成。
public interface WritableByteChannel
    extends Channel
{

    /**
     * 从给定缓冲区读取数据写入到此通道中。(同步)
     
     * @param  src
     *         写入通道字节缓冲区
     *
     * @return 写入的字节数
     *
     * @throws  NonWritableChannelException
     *          如果没有打开此通道进行读取
     *
     * @throws  ClosedChannelException
     *          如果该通道关闭
     *
     * @throws  AsynchronousCloseException
     *          如果另一个线程关闭此通道读取操作正在进行时
     *
     * @throws  ClosedByInterruptException
     *          如果另一个线程中断当前线程写入操作,正在此时关闭通道并设置当前线程的中断状态
     *
     * @throws  IOException
     *          如果发生其他I/O错误
     */
    public int write(ByteBuffer src) throws IOException;
}
3.2 ReadableByteChannel 接口

一个可以用来读取的通道。通道上在一个时间节点只能最多进行一个读操作。如果一个线程在通道上执行读操作 ,任何其他线程试图在该通道进行读操作都将被阻止,直到第一个读操作完成。

public interface ReadableByteChannel extends Channel {

    /**
     * 将数据从通道读取写入到给定的缓冲区中。(同步)
     *
     * @param  dst
     *         从通道读取数据后,写入字节的缓冲区
     *
     * @return  读取的字节数
     *
     * @throws  NonReadableChannelException
     *          如果没有打开此通道进行读取
     *
     * @throws  ClosedChannelException
     *          如果该通道关闭
     *
     * @throws  AsynchronousCloseException
     *          如果另一个线程关闭此通道读取操作正在进行时
     *
     * @throws  ClosedByInterruptException
     *          如果另一个线程中断当前线程读取操作,正在此时关闭通道并设置当前线程的中断状态
     *
     * @throws  IOException
     *          如果发生其他I/O错误
     */
    public int read(ByteBuffer dst) throws IOException;

}

3.3 ByteChannel 接口

  • 可以读写字节的通道
/**
 * 可以读写字节的通道。这个接口简单地统一了ReadableByteChannel,WritableByteChannel
 */

public interface ByteChannel
    extends ReadableByteChannel, WritableByteChannel
{
}

3.4 ScatteringByteChannel 接口

将此通道中的数据列读取,写入到给定缓冲区数组中。

public interface ScatteringByteChannel
    extends ReadableByteChannel
{

    /**
     * 将数据从此通道读取,写入到给定缓冲区数组子序列中。
     *
     * @param  dsts
     *         要写入的缓冲区数组
     *
     * @param  offset
     *         在缓冲区数组从哪个位置上缓冲区开始写入
     *
     * @param  length
     *         从offset开始,写入多少个缓冲区
     *
     * @return 从通道读取的字节数
     *
     * @throws  IndexOutOfBoundsException
     *          如果写入缓冲区字节大于字节数组总字节大小
     *
     * @throws  NonReadableChannelException
     *          如果通道未打开就开始读取
     *
     * @throws  ClosedChannelException
     *          如果通道关闭
     *
     * @throws  AsynchronousCloseException
     *          如果另一个线程关闭此通道读取操作正在进行时
     *
     * @throws  ClosedByInterruptException
     *          如果另一个线程中断当前线程读取操作,正在此时关闭通道并设置当前线程的中断状态
     *
     * @throws  IOException
     *          如果发生其他I/O错误
     */
    public long read(ByteBuffer[] dsts, int offset, int length)
        throws IOException;

    /**
     * 将数据从此通道读取,写入到给定缓冲区数组
     *
     *
     * @param  dsts
     *         要写入的缓冲区数组
     *
     * @return 从通道读取的字节数
     *
     * @throws  NonReadableChannelException
     *          如果通道未打开就开始读取
     *
     * @throws  ClosedChannelException
     *           如果通道关闭
     *
     * @throws  AsynchronousCloseException
     *           如果另一个线程关闭此通道读取操作正在进行时
     *
     * @throws  ClosedByInterruptException
     *          如果另一个线程中断当前线程读操作,同时通道被关闭
     *
     * @throws  IOException
     *           如果发生其他I/O错误
     */
    public long read(ByteBuffer[] dsts) throws IOException;

}

3.5 GatheringByteChannel 接口

从给定缓冲区数组向通道写入数据。

public interface GatheringByteChannel
    extends WritableByteChannel
{

    /**
     * 从给定缓冲区数组的子序列向此通道写入数据。
     *
     * @param  srcs
     *         写入通道字节缓冲区数组
     *
     * @param  offset
     *         在缓冲区数组从哪个位置上缓冲区开始读取
     *
     * @param  length
     *         从offset开始,读取多少个缓冲区
     *
     * @return  通道写入的字节数
     *
     * @throws  IndexOutOfBoundsException
     *          如果读取缓冲区字节大于字节数组总字节大小
     *
     * @throws  NonWritableChannelException
     *          如果通道未打开就开始写入
     *
     * @throws  ClosedChannelException
     *          如果通道关闭
     *
     * @throws  AsynchronousCloseException
     *          写入操作正在进行时,另一个线程关闭此通道
     *
     * @throws  ClosedByInterruptException
     *          如果另一个线程中断当前线程写操作,同时通道被关闭
     *
     * @throws  IOException
     *          如果发生其他I/O错误
     */
    public long write(ByteBuffer[] srcs, int offset, int length)
        throws IOException;


    /**
     * 从给定缓冲区数组向此通道写入一个字节序列。

     * @param  srcs
     *         写入通道字节缓冲区数组
     *
     * @return 通道写入的字节数
     *
     * @throws  NonWritableChannelException
     *          如果通道未打开就开始写入
     *
     * @throws  ClosedChannelException
     *          如果通道关闭
     *
     * @throws  AsynchronousCloseException
     *          写入操作正在进行时,另一个线程关闭此通道
     *
     * @throws  ClosedByInterruptException
     *          如果另一个线程中断当前线程写操作,同时通道被关闭
     *
     * @throws  IOException
     *          如果发生其他I/O错误
     */
    public long write(ByteBuffer[] srcs) throws IOException;

}

3.6 SeekableByteChannel 接口

通道中支持position,可以用来指定通道的读取或写入位置,当对通道进行非指定位置的读取写入时,position会伴随写入读取大小偏移

public interface SeekableByteChannel
    extends ByteChannel
{
    /**
     * 从该通道读取数据写入字节缓冲区,并更新通道中position
     */
    @Override
    int read(ByteBuffer dst) throws IOException;

    /**
     * 从给定缓冲区读取数据写入通道,并更新通道中position
     */
    @Override
    int write(ByteBuffer src) throws IOException;

    /**
     * 返回此通道的position。
     *
     * @return  返回此通道的position

     *
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IOException
     *          如果发生IO异常
     */
    long position() throws IOException;

    /**
     * 设置此通道的position。
     *
     *
     * @param  newPosition
     *         新position,
     *
     * @return  This channel
     *
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IllegalArgumentException
     *          If the new position is negative
     * @throws  IOException
     *          如果发生IO异常
     */
    SeekableByteChannel position(long newPosition) throws IOException;

    /**
     * 此通道所连接的实体的当前大小
     *
     * @return  当前大小(以字节为单位)
     *
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IOException
     *          如果发生IO异常
     */
    long size() throws IOException;

    /**
     * 将此通道连接到的实体截断为给定大小
     *
     * @param  size
     *         新的大小,非负字节计数
     *
     * @return  This channel
     *
     * @throws  NonWritableChannelException
     *          If this channel was not opened for writing
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IllegalArgumentException
     *          如果新尺寸为负
     * @throws  IOException
     *          如果发生IO异常
     */
    SeekableByteChannel truncate(long size) throws IOException;
}

3.7 AsynchronousChannel 接口

支持异步I/O操作的通道。

public interface AsynchronousChannel
    extends Channel
{
    /**
     * 关闭通道
     *
     * 如果一个线程在AsynchronousChannel通道上执行操作尚未完成被另一个线程调用close(),执行线程会抛出AsynchronousCloseException异常。
     *
     * AsynchronousChannel通道在关闭后,对其进行I/O操作,会立即完成,并抛出 ClosedChannelException异常
     *
     * @throws  IOException
     *          如果发生I/O错误
     */
    @Override
    void close() throws IOException;
}

3.8 AsynchronousByteChannel 接口

异步读写数据通道操作。

public interface AsynchronousByteChannel
    extends AsynchronousChannel
{
    /**
     * 将数据从通道读取写入给定的缓冲区中。(异步)
     *
     * @param   <A>
     *          操作时附加到I/O操作的对象类型。
     * @param   dst
     *          从通道读取写入的缓冲区
     * @param   attachment
     *          要附加到I/O操作的对象;可以是@code null
     * @param   handler
     *          IO完成回调处理程序
     *
     * @throws  IllegalArgumentException
     *          如果缓冲区是只读的
     * @throws  ReadPendingException
     *          若在上一个read()方法未完成之前,再次调用read()方法
     * @throws  ShutdownChannelGroupException
      *          如果通过和一个已经终止的AsynchronousChannelGroup关联
     */
    <A> void read(ByteBuffer dst,
                  A attachment,
                  CompletionHandler<Integer, ? super A> handler);

    /**
     * 将数据从通道读取写入给定的缓冲区中。(异步)
     *
     * @param   dst
     *          从通道读取写入的缓冲区
     *
     * @return  表示操作结果的Future
     *
     * @throws  IllegalArgumentException
     *          如果缓冲区是只读的
     * @throws  ReadPendingException
     *          若在上一个read()方法未完成之前,再次调用read()方法
     */
    Future<Integer> read(ByteBuffer dst);

    /**
     * 从给定缓冲区向此通道写入数据。

     * @param   <A>
     *          操作时附加到I/O操作的对象类型。
     * @param   src
     *          写入通道字节缓冲区
     * @param   attachment
     *          要附加到I/O操作的对象;可以是@code null
     * @param   handler
     *          IO完成回调处理程序
     *
     * @throws  WritePendingException
     *          若在上一个write()方法未完成之前,再次调用write()方法
     * @throws  ShutdownChannelGroupException
     *          如果通过和一个已经终止的AsynchronousChannelGroup关联
     */
    <A> void write(ByteBuffer src,
                   A attachment,
                   CompletionHandler<Integer, ? super A> handler);

    /**
     * 从给定缓冲区向此通道写入数据。
     *
     * @param   src
     *          写入通道字节缓冲区
     *
     * @return 表示操作结果的Future
     *
     * @throws  WritePendingException
     *          若在上一个write()方法未完成之前,再次调用write()方法
     */
    Future<Integer> write(ByteBuffer src);
}

CompletionHandler

异步回调处理接口

public interface CompletionHandler<V,A> {

    /**
     * 异步操作完成时调用。
     *
     * @param   result
     *          I/O操作的结果.
     * @param   attachment
     *          操作时附加到I/O操作的对象。
     */
    void completed(V result, A attachment);

    /**
     * 异步操作失败时调用。
     *
     * @param   exc
     *          I/O操作失败原因的异常
     * @param   attachment
     *          操作时附加到I/O操作的对象。
     */
    void failed(Throwable exc, A attachment);
}

3.9 InterruptibleChannel 接口

使通道能以异步的方式进行关闭与中断。

  • 如果一个线程在同时实现asynchronously和InterruptibleChannel通道上出现了阻塞状态,那么当其他线程调用这个通道的close()方法时, 这个呈阻塞状态的线程将接收到AsynchronousCloseException 异常。

  • 如果一个线程在同时实现asynchronously和InterruptibleChannel通道上出现了阻塞状态,那么当其他线程调用这个阻塞线程的
    interrupt()方法后,通道将被关闭,这个阻塞的线程将接收到ClosedByinterruptException异常

public interface InterruptibleChannel
    extends Channel
{

    /**
     * 关闭此通道
     *
     *
     * @throws  IOException  如果发生I/O错误
     */
    public void close() throws IOException;

}

3.10 NetworkChannel 接口

public interface NetworkChannel
    extends Channel
{
    /**
     * 将通道的套接字绑定到本地地址。
     *
     * @param   local
     *          绑定套接字的地址
     *
     * @return  当前Channel
     *
     * @throws  AlreadyBoundException
     *          如果套接字已绑定
     * @throws  UnsupportedAddressTypeException
     *          如果不支持给定地址的类型
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IOException
     *          如果发生其他I/O错误
     * @throws  SecurityException
     *          如果安装了安全管理器并且拒绝未指定的权限
     *
     * @see #getLocalAddress
     */
    NetworkChannel bind(SocketAddress local) throws IOException;

    /**
     * 返回此通道套接字绑定到的套接字地址
     *
     * @return 套接字绑定到的套接字地址,或@code null 如果通道的套接字未绑定
     *
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IOException
     *          如果发生IO异常
     */
    SocketAddress getLocalAddress() throws IOException;

    /**
     * 设置socket选项的值。
     *

     * @param   name
     *          选项的名称
     * @param   value
     *          选项的值
     *
     * @return  This channel
     *
     * @throws  UnsupportedOperationException
     *          如果此通道不支持socket选项
     * @throws  IllegalArgumentException
     *          如果该值不是此套接字选项的有效值
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IOException
     *          如果发生IO异常
     *
     * @see java.net.StandardSocketOptions
     */
    <T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException;

    /**
     * 返回socket选项的值。
     *
     * @param   name
     *          选项的名称
     *
     * @return  选项的值,如果没有设置返回null
     *
     * @throws  UnsupportedOperationException
     *          如果此通道不支持socket选项
     * @throws  ClosedChannelException
     *          如果通道被关闭
     * @throws  IOException
     *          如果发生IO异常
     *
     * @see java.net.StandardSocketOptions
     */
    <T> T getOption(SocketOption<T> name) throws IOException;

    /**
     * 返回此通道支持的一组套接字选项
     */
    Set<SocketOption<?>> supportedOptions();
}

3.11 MulticastChannel 接口

MulticastChannel 接口的主要作用是使通道支持Internet Protocol ( IP )多播。IP 多播就 是将多个主机地址进行打包,形成一个组( group ),然后将IP 报文向这个组进行发送,也就相当于同时向多个主机传输数据。

public interface MulticastChannel
    extends NetworkChannel
{
    /**
     * 关闭此通道

     *
     * @throws  IOException
     *          如果发生I/O错误
     */
    @Override void close() throws IOException;

    /**
     * 加入多播组以开始接收发送到该组的所有数据报,返回MembershipKey
     *
     * @param   group
     *          要加入的多播地址
     * @param   interf
     *          要加入组的网络接口
     * @return  MembershipKey
     *
     * @throws  IllegalArgumentException
     *          If the group parameter is not a {@link InetAddress#isMulticastAddress
     *          multicast} address, or the group parameter is an address type
     *          that is not supported by this channel
     * @throws  IllegalStateException
     *          如果通道已经具有特定于源的界面上的组
     * @throws  UnsupportedOperationException
     *          如果通道的套接字不是Internet协议套接字
     * @throws  ClosedChannelException
     *          如果该通道关闭
     * @throws  IOException
     *          如果发生I/O错误
     * @throws  SecurityException
     *          If a security manager is set, and its
     *          {@link SecurityManager#checkMulticast(InetAddress) checkMulticast}
     *          method denies access to the multiast group
     */
    MembershipKey join(InetAddress group, NetworkInterface interf)
        throws IOException;

    /**
     * 加入多播组以开始接收发送到该组的数据报来自给定的源地址。
     *
     *
     * @param   group
     *          要加入的多播地址
     * @param   interf
     *          要加入组的网络接口
     * @param   source
     *          来源地址
     *
     * @return  MembershipKey
     *
     * @throws  IllegalStateException
     *          如果通道当前是给定接口上接收所有数据报的组的成员
     * @throws  UnsupportedOperationException
     *          如果通道的套接字不是Internet协议套接字或不支持源筛选
     * @throws  ClosedChannelException
     *          如果该通道关闭
     * @throws  IOException
     *          如果发生I/O错误
     * @throws  SecurityException
     *          If a security manager is set, and its
     *          {@link SecurityManager#checkMulticast(InetAddress) checkMulticast}
     *          method denies access to the multiast group
     */
    MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source)
        throws IOException;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 7,533评论 1 143
  • # Java NIO # Java NIO属于非阻塞IO,这是与传统IO最本质的区别。传统IO包括socket和文...
    Teddy_b阅读 581评论 0 0
  • 0. 概述 1.Java NIO 2.ChannelChannel到Channel的数据传输transferFro...
    天堂鸟6阅读 1,852评论 0 2
  • 通道(Channel)是java.nio的第二个主要创新。它们既不是一个扩展也不是一项增强,而是全新、极好的Jav...
    桥头放牛娃阅读 3,040评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32