zoukankan      html  css  js  c++  java
  • IO通道

    本文原创,转载需标明原处。

    通道,主要负责传输数据,相当于流,但流只能是输入或输出类型中的其一,而通道则可以兼并二者。

    通道的基类是:Channel

    • boolean isOpen()
    • void close()

    通道有同步方式和异步方式。

    • 同步方式:亲力亲为,不交给他人来做。
    • 异步方式:需要等待的事情,交给他人来做。做完之后,可以自己接着做,也可以由他人继续接着做。

    通道有阻塞方式与非阻塞方式。

    • 阻塞方式:在做这件事时,可能需要等待,也可能不需要等待。
    • 非阻塞方式:在做这件事之前,确保不需要等待。换句话说,确保不需要等待的时候,我才来做。例如,银行人多的时候,我就直接离开,没人的时候,我就进入。

     

    同步方式的输入输出通道

     

    上图表示出,同步方式的输入输出通道的数据流通。这些通道的基类主要是ReadableByteChannelWritableByteChannel

    • ReadableByteChannelWritableByteChannel,操作一个ByteBuffer进行读写字节数据。
    • ScatteringByteChannelGatheringByteChannel分别是ReadableByteChannelWritableByteChannel强化版,不仅可以操作一个ByteBuffer,还可以操作一组ByteBuffer。
    • FileChannel提供了更为快捷的操作,直接操作ReadableByteChannelWritableByteChannel进行读写。
    • ByteChannel仅仅只是ReadableByteChannelWritableByteChannel的组合,因此自然也是那些同时继承了ReadableByteChannelWritableByteChannel的Channel的基类。
    • SeekableByteChannel(FileChannel是该类的唯一实现类),其表示不仅可以输入输出,还可以定位操作点,获取容量(文件大小)和缩减容量(文件大小)。

    异步方式的输入输出通道

    上图表示出,异步方式的输入输出通道的数据流通。

    异步方式的具体通道类有两个,分别是AsynchronousSocketChannel和AsynchronousFileChannel。

     

    输入输出通道

    整合所有输入输出的通道,可以有五种源头类型的通道:文件,网络,管道,输入流,输出流。

    可使用非阻塞方式的通道(以下简称可非阻塞通道)

    这类通道的基类是SelectableChannel,默认是阻塞,通过方法configBlocking(boolean)设置是否阻塞,方法isBlocking()查看是否阻塞。

    上图表示出具体的可非阻塞通道类,以及表示出非阻塞方式所使用到的各组件之间的关系图。

    具体怎么使用,可以参考其它相关的文章,最重要还是记得一点,非阻塞的概念就是确保这件事情不需要等待的时候才去做。怎么确保,selector的select()系列方法,这些方法会阻塞,阻塞到它检测到那些事情不需要等待了,就会让我去做。

    需要注意的是,在使用非阻塞方式的方法时,必须先使用configBlocking(false),设置为非阻塞。

     

    异步方式的通道

    异步的概念,就是把需要等待的事情,委托给他人来做,做完的时候,可以选择自己接着做,也可以继续由受委托的人接着做。

    那么异步有两种结果,一种是自己接着做,一种是他人接着做。

    自己接着做的方式,操作方法的返回值是一个Future对象,使用这个对象可以检测完成进度。

    • boolean isDone():测试是否完成。
    • boolean isCanceled():测试异步运行是否被中止。
    • boolean cannel(boolean):中止异步运行,并返回是否中止成功。
    • V get()/get(long, TimeUnit):有些操作需要获取运行的返回值,如读取时,需要知道读取的字节数。但如果异步运行未完成或未中止,就会进入阻塞。

    他人接着做的方式,操作参数里需要传入一个CompletionHandler对象,这个对象的方法将由异步线程来调用。

    • void completed(V result, A attachment):完成时异步运行的方法。
    • void failed(Throwable exc, A attachment):失败时异步运行的方法。

    异步方式的通道基类是AsynchronousChannel,但这个类仅仅只是一个身份类,并没有提供任何操作方法。它的子类有:

    • AsynchronousFileChannel
    • AsynchronousByteChannel:这是一个接口,表示不仅具有异步方式,同时是输入输出字节类型的通道。但唯一的实现类为AsynchronousSocketChannel。
    • AsynchronousServerSocketChannel
    • AsynchronousSocketChannel

    其它通道

    • NetworkChannel:网络通道,用于网络的通道。
    • InterruptibleChannel:表示线程被中止时,可以中断输入输出的通道。

    通道的建立

    一般使用静态方法open建立,其它方式的建立,如下图:

    待续更新……

  • 相关阅读:
    HDU
    HDU
    HDU
    HDU
    西电网络赛
    西电网络赛
    西电网络赛
    西电网络赛
    西电网络赛
    西电网络赛
  • 原文地址:https://www.cnblogs.com/hvicen/p/6168426.html
Copyright © 2011-2022 走看看