本文记录java Nio的接口与实现

NIO

Channel a nexus for I/O operations, it represents an open connection to an entity such as a hardware device, a file , a network socket and so on.

SelectableChannel A Channel that can be multiplexed via a Selector

Selector A multiplexor of SelectableChannel objects

SelectorProvider Service-Provider class for selectors and selectable channels

KQueue I/O event notification systems used mainly on FreeBSD and macOS.

epoll similar event notification system used primarily on Linux


interface Channel {
    boolean isOpen()
    void close()
}



interface NetworkChannel extends Channel {
    NetworkChannel bind(SocketAddress local)
    SocketAddress getLocalAddress()
}


abstract class  SelectorProviderImpl extends SelectorProvider


abstract class SelectableChannel  {
    abstract SelectorProvider provider()
    abstract SelectionKey keyFor(Selector sel)
    abstract boolean isRegistered()
    abstract SelectionKey register(Selector sel, int ops, Object att)
    abstract boolean isBlocking()
    abstract Object blockingLock()
}
abstract class AbstractSelectableChannel extends SelectableChannel {
    SelectorProvider provider
    SelectionKey[] keys
    Object keyLock
    Object regLock
    SelectionKey register( sel,  ops, att)


}

abstract class Selector implements Closeable {
     static Selector open()
     abstract boolean isOpen()
     abstract SelectorProvider provider()
     abstract Set<SelectionKey> keys()
     abstract Set<SelectionKey> selectedKeys()
     abstract int select()
     abstract Selector wakeup()
     abstract void close()
}

abstract class SelectorProvider {
    static SelectorProvider provider()
    abstract DatagramChannel openDatagramChannel()
    abstract Pipe openPipe()
    abstract AbstractSelector openSelector()
    abstract ServerSocketChannel openServerSocketChannel()
    abstract SocketChannel openSocketChannel()
}


    abstract class FileChannel {
        open(Path)
        read(ByteBuffer)
        write(ByteBuffer)
        lock()
        close()
    }

    class SocketChannelImpl extends SocketChannel implements SelChImpl {
        FileDescriptor fd
        ReentrantLock readLock
        ReentrantLock writeLock
        Object stateLock
        volatile int state
        long readerThread
        long writerThread
        SocketAddress localAddress
        SocketAddress remoteAddress
        Socket socket
    }

    abstract class AbstractSelector extends Selector {
        SelectorProvider provider
        Set<SelectionKey> cancelledKeys
        SelectionKey register(AbstractSelectableChannel ch,int ops, Object att)
    }

    abstract class SelectorImpl extends AbstractSelector {
        Set<SelectionKey> keys
        Set<SelectionKey> selectedKeys
        Set<SelectionKey> publicKeys
        Set<SelectionKey> publicSelectedKeys
        Deque<SelectionKeyImpl> cancelledKeys

    }

    class KQueueSelectorImpl extends SelectorImpl {
        int kqfd
        long pollArrayAddress
        native int create()
        native int register(int kqfd, int fd, int filter, int flags)
        native int poll(int kqfd, long pollAddress, int nevents, long timeout)
    }

    abstract class SocketChannel extends  AbstractSelectableChannel implements NetworkChannel {
        abstract int read(ByteBuffer dst)
        abstract int write(ByteBuffer src)
        static SocketChannel open()
    }

    class KQueueSelectorProvider extends SelectorProviderImpl

    Channel o-- FileChannel
    Selector *-- SelectorProvider
    Selector -down-> SelectableChannel : select

    Channel <|-- SelectableChannel
KQueueSelectorProvider --> KQueueSelectorImpl: provide
SelectorProvider --> SocketChannel:open

NIO2