Java Nio
本文记录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