3JAVA NIO Scattering 与 Gathering 的概念 与示例

NIO 内存映射文件

DirectByteBuffer 的父类文件 MappedByteBuffer

内存映射文件 是允许java程序直接从内存访问的文件,我们可以将整个文件,映射到内存中,由操作系统将进行读和写  
内存映射文件 ,也就是堆外内存 

Scattering 与 Gathering 的概念 的用法 用于分门别类

3JAVA NIO Scattering 与 Gathering 的概念 与示例_第1张图片
3JAVA NIO Scattering 与 Gathering 的概念 与示例_第2张图片

模拟一个网络程序对数据的请求的数据的分门别类 ,我们来理解上面Buffer的分散和收集的含义

服务器端 :java
read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写。

write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。 write


 public static void main(String[] args) throws Exception {
        //Scattering  分散 读的时候不仅可以传递一个Buffer,同时也可以传递Buffer 数组
        //Gatering  收集 将来自于多个Buffer


        //网络的程序
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //端口
        InetSocketAddress address = new InetSocketAddress(8899);

        serverSocketChannel.socket().bind(address);

        //定义一个message的长度
        int messageLenge = 2 + 3 + 4;
        //构造一个Byte buffer数组
        ByteBuffer[] buffer = new ByteBuffer[3];
 		//定义不同长度的Buffer
        buffer[0] = ByteBuffer.allocate(2);
        buffer[1] = ByteBuffer.allocate(3);
        buffer[2] = ByteBuffer.allocate(4);

        SocketChannel socketChannel = serverSocketChannel.accept();
        // 死循环 不断的往里面读
        while (true) {
            int byteRead = 0;
            while (byteRead < messageLenge) { 
            	//read()方法按照buffer在数组中的顺序将从channel中读取的数据写入到buffer,当一个buffer被写满后,channel紧接着向另一个buffer中写。
                long read = socketChannel.read(buffer);

                byteRead += read;

                System.out.println("byteRead" + byteRead);

                Arrays.asList(buffer).stream().map(byteBuffer ->
                        "position" + byteBuffer.position() + "," + "limit" + byteBuffer.limit()
                ).forEach(System.out::println);
            }
            Arrays.asList(buffer).forEach(i -> {
                i.flip();
            });
            //定义读到的长度  并且都写还给客户端 
            long byteWrite = 0;
            while (byteWrite < messageLenge) { 
        		
                long write = socketChannel.write(buffer);
                byteWrite += write;
            }
            Arrays.asList(buffer).forEach(byteBuffer -> {
                byteBuffer.clear();
            });

            System.out.println("byteRead:" + byteRead + "byteWrite:" + byteWrite + "messageLenge:" + messageLenge);
        }
    }



Result

Result : 
byteRead1
position1,limit2
position0,limit3
position0,limit4
byteRead3
position2,limit2
position1,limit3
position0,limit4

总结

怎么感觉与FonkJoin像

你可能感兴趣的:(JAVA,NIO,JAVA,Netty,NIO,相关笔记)