美文网首页
Java NIO Channel、Buffer

Java NIO Channel、Buffer

作者: 沐兮_d64c | 来源:发表于2019-01-28 10:43 被阅读0次

    1,Channel

    FileDescriptor:fd文件描述符。representing an open file, an open socket, or another source or sink of bytes.
    1)可以异步读写的通道,代表一个到可进行I/O操作实体(file、socket、hardware device)的开放连接。Channel中的数据总是会读取到Buffer或者从Buffer中写入。
    2)主要实现类
    核心:EpollSelectorImpl 是linux上SelectorProvider的实现。
    FileChannel:文件中读写数据。打开文件时返回fd,通过fd和FileChannelImpl创建FileChannel

    image.png
    image.png
    DatagramChannel: 通过UDP读写网络中的数据。借助SelectorProvider new一个DatagramChannelImpl。底层:通过Net打开socket,返回fd。
    image.png
    SocketChannel:通过TCP读写网络中的数据。通过SocketChannelImpl创建SocketChannel。底层使用this.fd = Net.socket(true);创建fd。
    image.png
    image.png
    ServerSocketChannel:监听TCP连接,创建SocketChannel。
    image.png
    image.png
    3)Socket、SocketChannel 以及 ServerSocket、ServerSocketChannel的区别。
    Socket与SocketChannel: 实现客户端与服务端连接;Socket在java.net包,SocketChannel在java.nio包;Socket是阻塞连接,SocketChannel可以设置非阻塞。
    ServerSocket: Socket通常是阻塞连接,服务端ServerSocket为客户端Socket分配单独的线程,线程可能处于长时间的阻塞状态。
    ServerSocketChannel:服务端借助Selector,可以使用一个线程处理多个客户端Socket请求。
    ServerSocket的accept方法底层:native void socketAccept(SocketImpl s) throws IOException;
    image.png
    ServerSocketChannel底层:native int accept0(FileDescriptor var1, FileDescriptor var2, InetSocketAddress[] var3) throws IOException;
    image.png
    4)使用方式
    image.png
    SelectionKey :代表channel向selector注册的令牌。
    image.png
    OP_READ = 1 << 0:read operations.
    OP_WRITE = 1 << 2:write operations.
    OP_CONNECT = 1 << 3:socket-connect operations.
    OP_ACCEPT = 1 << 4:socket-accept operations.

    2,Buffer

    1)本质: 一块可以写入数据、读取数据的内存。
    2)4个属性

    image.png
    3)2种模式
    image.png
    flip切换至read模式
    image.png
    clear切换至write模式
    image.png
    4)使用channel来操作buffer
    Channel的读操作从channel读,写入到buffer中
    image.png
    Channel的写操作将buffer中的数据读出,写入channel中
    image.png
    写入Buffer的2种方式:
    int bytesRead = inChannel.read(buf);
    buf.put(127);
    从Buffer读的2种方式:
    int bytesWritten = inChannel.write(buf);
    byte aByte = buf.get();
    从文件中读取到buffer,打印:
    image.png
    将buffer中数据,写入到channel ->文件中
    image.png
    5)ByteBuffer实现类
    ByteBuffer底层字节数组 final byte[] hb;
    image.png
    堆内存
    image.png
    image.png
    直接内存,基于Unsafe
    image.png
    image.png

    相关文章

      网友评论

          本文标题:Java NIO Channel、Buffer

          本文链接:https://www.haomeiwen.com/subject/ijqelqtx.html