• 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。
  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/1754510.html
Copyright © 2020-2023  润新知