• NIO入门了解Buffer


    NIO入门-了解Buffer

    Buffer实例的状态由下面三个变量来决定:

    • Position,这个变量表明已经读写了多少数据;
    • Limit,这个变量表明还有多少数据需要读写;
    • Capacity,这个变量表明缓冲区的最大容量。

    从大小关系来看,Position≤Limit≤Capacity。在通过Buffer进行读写的时候,Buffer.clear()和Buffer.flip()这两个函数将会改变这三个变量,我们可以通过下面这个例子来查看这个过程:

    01 import java.io.FileOutputStream;
    02 import java.nio.ByteBuffer;
    03 import java.nio.channels.FileChannel;
    04  
    05 public class WriteFile {
    06     static public void main(String args[]) throws Exception {
    07         FileOutputStream fout = new FileOutputStream("out.txt");
    08         FileChannel fcout = fout.getChannel();
    09         ByteBuffer buffer = ByteBuffer.allocate(1024);
    10  
    11         buffer.putInt(3);
    12         buffer.putInt(24);
    13         buffer.putInt(7);
    14         System.out.println(buffer.toString());
    15         // 输出java.nio.HeapByteBuffer[pos=12 lim=1024 cap=1024]
    16  
    17         buffer.flip();
    18         System.out.println(buffer.toString());
    19         // 输出java.nio.HeapByteBuffer[pos=0 lim=12 cap=1024]
    20  
    21         fcout.write(buffer);
    22         System.out.println(buffer.toString());
    23         // 输出java.nio.HeapByteBuffer[pos=12 lim=12 cap=1024]
    24  
    25         buffer.clear();
    26         System.out.println(buffer.toString());
    27         // 输出java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
    28     }
    29 }

    当我们要将数据写到输出通道之前(fux注:即调用session.write方法前),我们必须调用 flip() 方法。这个方法做了两件事情:

    1. 它将 limit 设置为当前 position,在WriteFile.class中,limit被设置成12,这意味着Buffer实例中保存了12字节数据;
    2. 它将 position 设置为 0,在WriteFile.class中,position被设置成0,这意味着Buffer实例下一个读写的位置从0开始。

    而clear() 方法会重设缓冲区以便接收更多的字节,这个方法做了两件事情:

    1. 它将 limit 设置为与 capacity 相同。
    2. 它设置 position 为 0。
  • 相关阅读:
    HTML特殊字符编码对照表(备记)
    【java线程】锁机制
    java判断一个字符串是否为空,isEmpty和isBlank的区别
    对Java中properties类的理解
    使用redis的zset实现高效分页查询(附完整代码)
    ServiceStack.Redis高效封装和简易破解
    3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
    2.NetDh框架之简单高效的日志操作类(附源码和示例代码)
    1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)
    SQL Server索引原理解析
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/1754510.html
Copyright © 2020-2023  润新知