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   
     *          操作时附加到I/O操作的对象类型。
     * @param   dst
     *          从通道读取写入的缓冲区
     * @param   attachment
     *          要附加到I/O操作的对象;可以是@code null
     * @param   handler
     *          IO完成回调处理程序
     *
     * @throws  IllegalArgumentException
     *          如果缓冲区是只读的
     * @throws  ReadPendingException
     *          若在上一个read()方法未完成之前,再次调用read()方法
     * @throws  ShutdownChannelGroupException
      *          如果通过和一个已经终止的AsynchronousChannelGroup关联
     */
     void read(ByteBuffer dst,
                  A attachment,
                  CompletionHandler handler);

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

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

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

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

CompletionHandler

异步回调处理接口

public interface CompletionHandler {

    /**
     * 异步操作完成时调用。
     *
     * @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
     */
     NetworkChannel setOption(SocketOption name, T value) throws IOException;

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

    /**
     * 返回此通道支持的一组套接字选项
     */
    Set> 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;
}

你可能感兴趣的:(JavaNIO-通道01 Channel接口结构)