精华内容
参与话题
问答
  • NIO - Buffer缓冲区

    2013-11-14 22:14:01
    转自:... *Buffer : 缓冲区 是特定基本类型元素的线性有限序列  Buffer中的数据结构是原始数据类型的数组 例如 jdk ByteBuffer中定义的byrte数组 [java] view plai

    转自:http://blog.csdn.net/java2000_wl/article/details/7615543

    *Buffer : 缓冲区  是特定基本类型元素的线性有限序列  

                     Buffer中的数据结构是原始数据类型的数组

    例如   jdk  ByteBuffer中定义的byrte数组

    1. public abstract class ByteBuffer  extends Buffer  
    2.     implements Comparable<ByteBuffer>  
    3. {  
    4.     final byte[] hb;  
    5. }  

    Buffer类图(除去boolean原始类型没有  其他都有)


    *Buffer的实例化

    1.Buffer具体子类的allocate方法

      例如 ByteBuffer 

    1. public static ByteBuffer allocate(int capacity){}  //参数为Buffer的容量  

    2.Buffer具体子类的wrapa方法

     例如DoubleBuffer

    1. public static DoubleBuffer wrap(double[] array) {}  


    *重要属性(父类Buffer中定义):

    1.capacity  容量  缓冲区中能够容纳元素的数量  也就是Buffer中数组的大小   不可以改变

    2.position  位置  下一个要操作(读写)的元素索引  位置会随着调用相应的read  put等方法改变

    3.limit     上限   缓冲区中目前容纳了 多少元素  也就是缓冲区中目前元素的个数

    4.mark    用于记录position的当前位置  在调用reset方法  重新设置position的值为 mark变量上次记录的

     上面四个属性 要遵循一下关系

      0 <= 标记(mark) <= 位置(position) <= 限制 (limit)<= 容量(capacity)

    * 重要方法(以ByteBuffer为例)

     1. 获取缓冲区中的内容 此方法有多个版本重载

    1. public byte get() {  
    2. urn hb[ix(nextGetIndex())];  
    3. }  

    2.向缓冲区写入数据  有多个重载

    1.   public ByteBuffer put(byte x) {  
    2. hb[ix(nextPutIndex())] = x;  
    3. return this;  
    4.    }  

    3.在当前缓冲区基础上  创建一个新的缓冲区

    1. public ByteBuffer slice() {  
    2. urn new HeapByteBuffer(hb, -10,this.remaining(),this.remaining(), this.position() + offset);  
    3. }  

     4 返回缓冲区的容量

    1. public final int capacity() {  
    2. urn capacity;  
    3. }  

      5. 为position做个标记

    1.    public final Buffer mark() {  
    2. mark = position;  
    3. return this;  
    4.    }  

      6.将缓冲区的位置设置为以前标记的位置

    1.    public final Buffer reset() {  
    2.        int m = mark;  
    3. position = m;  
    4. return this;  
    5.    }  

      7.返回缓冲区下一个要操作元素的索引

    1. public final int position() {  
    2. urn position;  
    3. }  

      8.设置缓冲区起始操作(读写)索引 和  有效数据索引

    1.    public final Buffer flip() {  
    2. limit = position;  
    3. position = 0;  
    4. mark = -1;  
    5. return this;  
    6.    }  

       9.重置缓冲区

    1.    public final Buffer clear() {  
    2. position = 0;  
    3. limit = capacity;  
    4. mark = -1;  
    5. return this;  
    6.    }  

        后面两个方法很重要  

         读文件的实例代码

    1. //..省略  
    2.         FileChannel fileChannel = fileInputStream.getChannel();  
    3.         //1.初始化内部数组  
    4.         ByteBuffer buffer = ByteBuffer.allocate(4);  
    5.         //2.read方法会设置position  
    6.         while(fileChannel.read(buffer) != -1) {  
    7.             //3.limit = position;   
    8.             //position = 0  
    9.             buffer.flip();  
    10.             System.out.println(charset.decode(buffer));  
    11.             //4.position = 0, limit=capacity  
    12.             buffer.clear();   
    13.         }  
    14.         //..省略  

                          1.初始化容量为 4的Buffer  Buffer 数组全部是空的

                                

                                 2.调用Channel的read方法  向缓冲区写入2个字节

                                  

                               3.如果这个时候调用 Buffer get方法 读的是position =2 limit=3之间的数据

                                   
                            4.调用 Buffer #flip方法之后

                               

                              5.再一次调用Buffer get方法

                                 

                                 6.Buffer clean方法

                                     

     

    展开全文
  • Node.js 之Buffer缓冲区

    千次阅读 2016-02-19 14:57:35
    因此Node.js中定义了Buffer类用来存放二进制数据的缓存。如何创建Buffer类创建固定长度自己的Buffer实例:var buf = new Buffer(10);通过固定数组创建Buffer实例var buf = new Buffer([10,20,30,40,

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
    但在处理像TCP流或文件流时,必须使用到二进制数据。因此Node.js中定义了Buffer类用来存放二进制数据的缓存区。

    如何创建Buffer类

    创建固定长度自己的Buffer实例:

    var buf = new Buffer(10);

    通过固定数组创建Buffer实例

    var buf = new Buffer([10,20,30,40,50]);

    通过字符串来创建Buffer实例

    var buf = new Buffer("www.runoob.com","utf-8");

    utf-8是默认的编码模式,还有支持”ascii”,”utf8”,”utf16le”,”ucs2”,”base64”和”hex”.

    如何写入缓冲区

    写入Node缓冲区的语法如下:

    buf.write(string,[,offet][,length][,encoding]);

    其中[xxx]表示可省略。
    参数描述如下:

    • string-写入缓冲区的字符串
    • offset-缓冲区开始写入的索引值,默认为0
    • length-写入的字节数,默认为buffer.length
    • encoding-使用的编码。默认为’utf8’.
      返回值

      返回实际写入的大小.如果buffer空间不足,则只写入部分字符串

    buf = new Buffer(256);
    len = buf.write("www.runoob.com");
    
    console.log("写入字节数 : "+  len);

    输出结果:

    $node main.js
    写入字节数:14

    从缓冲区读取数据 语法

    读取Node缓冲区数据的语法如下:

    buf.toString([encoding][,start][,end])

    参数描述如下

    • encoding-使用的编码。默认是’utf8’
    • start-指定开始读取的索引位置,默认0
    • end-结束位置,默认为缓冲区的末尾

    返回值
    解码缓冲区数据并使用制定的编码返回字符串。
    实例

    buf = new Buffer(26);
    for (var i = 0 ; i < 26 ; i++) {
      buf[i] = i + 97;
    }
    
    console.log( buf.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
    console.log( buf.toString('ascii',0,5));   // 输出: abcde
    console.log( buf.toString('utf8',0,5));    // 输出: abcde
    console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde

    执行代码如下

    abcdefghijklmnopqrstuvwxyz
    abcde
    abcde
    abcde

    将Buffer转成为JSON对象

    语法:

    buf.toJSON()

    实例

    var buf = new Buffer('www.runoob.com');
    var json = buf.toJSON();
    console.log(json);

    执行代码,输出如下

    { type: 'Buffer',
      data: [ 119, 119, 119, 46, 98, 97, 105, 100, 117, 46, 99, 111, 109 ] }

    缓冲区合并

    语法
    Node缓冲区合并的语法如下:

    Buffer.concat(list[,totalLength])

    参数描述如下:

    • list - 用于合并的Buffer对象数组列表
    • totalLength-指定合并后Buffer对象的总长度

    返回值
    返回一个多个成员合并的新Buffer对象。
    实例

    var buffer1 = new Buffer("我是菜鸟");
    var buffer2 = new Buffer("www.runoob.com");
    var buffer3 = Buffer.concat([buffer1,buffer2]);
    console.log("buffer3 内容:"+buffer3.toString());

    执行上面的代码,输出结果为

    buffer3 内容:我是菜鸟www.runoob.com

    缓冲区比较

    语法
    Node Buffer比较的函数语法如下所示,该方法在Node.js v0.12.2版本引入

    buf.compare(otherBuffer);
    参数

    • otherBuff-与but对象比较的另一个Buffer对象。

    返回值
    返回一个数字,表示buf在otherBuffer之前,之后或相同。
    实例

    var buffer1 = new Buffer('ABC');
    var buffer2 = new Buffer('ABCD');
    var result = buffer1.compare(buffer2);
    
    if(result < 0) {
       console.log(buffer1 + " 在 " + buffer2 + "之前");
    }else if(result == 0){
       console.log(buffer1 + " 与 " + buffer2 + "相同");
    }else {
       console.log(buffer1 + " 在 " + buffer2 + "之后");
    }

    执行上面的代码,输出结果为

    ABC在ABCD之前

    注意:这里只有之前的情况和等于情况可以判断,而且compare的参数的字符串长度必须小雨函数调用者。

    缓冲区拷贝

    语法

    buf.copy(targetBuffer[,targetStart][,sourceStart][,sourceEnd])

    参数
    参数描述如下:

    • targetBuffer-要拷贝的Buffer对象
    • targetStart-数字,可选,默认:0
    • sourceStart-数字,可选,默认:0
    • sourceEnd-数字,可选,默认:buffer.length

    返回值
    没有返回值

    实例

    var buffer1 = new Buffer('ABC');
    // 拷贝一个缓冲区
    var buffer2 = new Buffer(3);
    buffer1.copy(buffer2);
    console.log("buffer2 content: " + buffer2.toString());

    输出结果

    buffer2 content: ABC

    缓冲区裁剪

    语法

    buf.slice([start][, end])

    参数

    • start -数字,可选,默认:0
    • end - 数字,可选, 默认:buffer.length

    返回值
    返回一个新的缓冲区,它和旧缓冲区指向同一块内测,但是从索引start到end的位置剪切

    实例

    var buffer1 = new Buffer('runoob');
    // 剪切缓冲区
    var buffer2 = buffer1.slice(0,2);
    console.log("buffer2 content: " + buffer2.toString());

    执行结果如下

    buffer2 content: ru

    缓冲区长度

    语法
    Node缓冲区长度计算语法

    but.length;

    返回值
    返回Buffer对象所占据的内存长度

    实例

    var buffer = new Buffer('www.runoob.com');
    //  缓冲区长度
    console.log("buffer length: " + buffer.length);

    输出结果

    buffer length: 14

    方法参考手册

    以下列出了 Node.js Buffer 模块常用的方法(注意有些方法在旧版本是没有的):

    序号方法 & 描述
    1new Buffer(size)
    分配一个新的 size 大小单位为8位字节的 buffer。 注意, size 必须小于 kMaxLength,否则,将会抛出异常 RangeError。
    2new Buffer(buffer)
    拷贝参数 buffer 的数据到 Buffer 实例。
    3new Buffer(str[, encoding])
    分配一个新的 buffer ,其中包含着传入的 str 字符串。 encoding 编码方式默认为 ‘utf8’。
    4buf.length
    返回这个 buffer 的 bytes 数。注意这未必是 buffer 里面内容的大小。length 是 buffer 对象所分配的内存数,它不会随着这个 buffer 对象内容的改变而改变。
    5buf.write(string[, offset][, length][, encoding])
    根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。 offset 偏移量默认值是 0, encoding 编码方式默认是 utf8。 length 长度是将要写入的字符串的 bytes 大小。 返回 number 类型,表示写入了多少 8 位字节流。如果 buffer 没有足够的空间来放整个 string,它将只会只写入部分字符串。 length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。
    6buf.writeUIntLE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算,例如:
    var b = new Buffer(6);
    b.writeUIntBE(0x1234567890ab, 0, 6);
    // <Buffer 12 34 56 78 90 ab>
    
    noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    7buf.writeUIntBE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    8buf.writeIntLE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    9buf.writeIntBE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    10buf.readUIntLE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    11buf.readUIntBE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    12buf.readIntLE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    13buf.readIntBE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    14buf.toString([encoding][, start][, end])
    根据 encoding 参数(默认是 ‘utf8’)返回一个解码过的 string 类型。还会根据传入的参数 start (默认是 0) 和 end (默认是 buffer.length)作为取值范围。
    15buf.toJSON()
    将 Buffer 实例转换为 JSON 对象。
    16buf[index]
    获取或设置指定的字节。返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。
    17buf.equals(otherBuffer)
    比较两个缓冲区是否相等,如果是返回 true,否则返回 false。
    18buf.compare(otherBuffer)
    比较两个 Buffer 对象,返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。
    19buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])
    buffer 拷贝,源和目标可以相同。 targetStart 目标开始偏移和 sourceStart 源开始偏移默认都是 0。 sourceEnd 源结束位置偏移默认是源的长度 buffer.length 。
    20buf.slice([start][, end])
    剪切 Buffer 对象,根据 start(默认是 0 ) 和 end (默认是 buffer.length ) 偏移和裁剪了索引。 负的索引是从 buffer 尾部开始计算的。
    21buf.readUInt8(offset[, noAssert])
    根据指定的偏移量,读取一个有符号 8 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 如果这样 offset 可能会超出buffer 的末尾。默认是 false。
    22buf.readUInt16LE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 字节序格式读取一个有符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    23buf.readUInt16BE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 字节序格式读取一个有符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    24buf.readUInt32LE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    25buf.readUInt32BE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    26buf.readInt8(offset[, noAssert])
    根据指定的偏移量,读取一个 signed 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    27buf.readInt16LE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 格式读取一个 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    28buf.readInt16BE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 格式读取一个 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    29buf.readInt32LE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    30buf.readInt32BE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    31buf.readFloatLE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位浮点数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
    32buf.readFloatBE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位浮点数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
    33buf.readDoubleLE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位double。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    34buf.readDoubleBE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位double。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    35buf.writeUInt8(value, offset[, noAssert])
    根据传入的 offset 偏移量将 value 写入 buffer。注意:value 必须是一个合法的有符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则不要使用。默认是 false。
    36buf.writeUInt16LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的有符号 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    37buf.writeUInt16BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的有符号 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    38buf.writeUInt32LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    39buf.writeUInt32BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    40buf.writeInt8(value, offset[, noAssert])
    根据传入的 offset 偏移量将 value 写入 buffer 。注意:value 必须是一个合法的 signed 8 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    41buf.writeInt16LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
    42buf.writeInt16BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
    43buf.writeInt32LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    44buf.writeInt32BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    45buf.writeFloatLE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    46buf.writeFloatBE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    47buf.writeDoubleLE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    48buf.writeDoubleBE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    49buf.fill(value[, offset][, end])
    使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。
    展开全文
  • 我们已经写满了缓冲区,现在我们必须准备将其清空。我们想把这个缓冲区传递给一个通道,以使内容能被全部写出。但如果通道现在在缓冲区上执行get(),那么它将从我们刚刚插入的有用数据之外取出未定义数据。如果我们...

    转自http://cheng330301560.iteye.com/blog/1028820

    Flip()翻转

    我们已经写满了缓冲区,现在我们必须准备将其清空。我们想把这个缓冲区传递给一个通道,以使内容能被全部写出。但如果通道现在在缓冲区上执行get(),那么它将从我们刚刚插入的有用数据之外取出未定义数据。如果我们将位置值重新设为0,通道就会从正确位置开始获取,但是它是怎样知道何时到达我们所插入数据末端的呢?这就是上界属性被引入的目的。上界属性指明了缓冲区有效内容的末端。我们需要将上界属性设置为当前位置,然后将位置重置为0。我们可以人工用下面的代码实现: buffer.limit(buffer.position()).position(0); 但这种从填充到释放状态的缓冲区翻转是API设计者预先设计好的,他们为我们提供了一个非常便利的函数: Buffer.flip(); Flip()函数将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素的释放状态。比如:

     

    我们定义一个容量为10的字节缓冲区,这里它有一个上界limit和当前位置position,limit这时的大小是10,假如我们这时加入3个数字,这时position位置指向4,这时你如果想读数据的话,使用这个方法后,position变为0,而limit变为4

    Rewind()

    与flip()相似,但不影响上界属性。它只是将位置值设回0。您可以使用rewind()后退,重读已经被翻转的缓冲区中的数据。

    hasRemaining()

    布尔函数会在释放缓冲区时告诉您是否已经达到缓冲区的上界。以下是一种将数据元素从缓冲区释放到一个数组的方法

     

    for (int i = 0; buffer.hasRemaining( ), i++)

    { myByteArray [i] = buffer.get( ); }

     作为选择,remaining()函数将告知您从当前位置到上界还剩余的元素数目

     

    int count = buffer.remaining( );

    for (int i = 0; i < count, i++)

     { myByteArray [i] = buffer.get( ); }

     

    Clear()

    Clear()函数将缓冲区重置为空状态。它并不改变缓冲区中的任何数据元素,而是仅仅将上界设为容量的值,并把位置设回0

     

    压缩compact()

    有时,您可能只想从缓冲区中释放一部分数据,而不是全部,然后重新填充。为了实现这一点,未读的数据元素需要下移以使第一个元素索引为0。尽管重复这样做会效率低下,但这有时非常必要,而API对此为您提供了一个compact()函数。这一缓冲区工具在复制数据时要比您使用get()和put()函数高效得多还要注意的是,位置已经被设为被复制的数据元素的数目。也就是说,缓冲区现在被定位在缓冲区中最后一个“存活”元素后插入数据的位置。最后,上界属性被设置为容量的值,因此缓冲区可以被再次填满。调用compact()的作用是丢弃已经释放的数据,保留未释放的数据,并使缓冲区对重新填充容量准备就绪

     

    展开全文
  • NIO Buffer缓冲区的duplicate与slice区别

    千次阅读 2019-02-13 14:31:42
    英文翻译过来是复制的意思,根据源码,调用duplicate方法返回的Buffer对象就是复制了一份原始缓冲区,复制了position、limit、capacity这些属性,但是,复制后的缓冲区get和put所操作的数组还是与原始缓冲区一样的,...

    duplicate

    英文翻译过来是复制的意思,根据源码,调用duplicate方法返回的Buffer对象就是复制了一份原始缓冲区,复制了position、limit、capacity这些属性,但是,复制后的缓冲区get和put所操作的数组还是与原始缓冲区一样的,所以对复制后的缓冲区进行修改也会修改原始的缓冲区,反之亦然。

     

    slice

    如下图所示

    英文翻译后是切片、划分的意思。。。调用该方法得到的新缓冲区所操作的数组还是原始缓冲区中的那个数组,不过,通过slice创建的新缓冲区只能操作原始缓冲区中数组剩余的数据,即索引为调用slice方法时原始缓冲区的position到limit索引之间的数据,超出这个范围的数据通过slice创建的新缓冲区无法操作到。

    像上图中右下角的就是slice buffer,它操作的数组0、1、2三个索引的加上offset偏移量就是原始数组中的3、4、5了,在执行get或者put时,都会加上offset。。然后创建slice buffer时limit和capcity都会被限制为原始缓冲区的remainning的返回值,offset被设置比为原始position的值,所以slice buffer调用clear和flip之类的方法都不会导致操作越界。。

    看源码:

    展开全文
  • BUFFER和CACHE两者都具有提高系统IO的能力,但是这两个概念是有区别的,原理也不尽相同. 首先是概念介绍: Cache:缓存,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远...
  • Buffer听起来很高大尚,实际上的功能和Tab、window是一模一样的。只是这些东西的内在实现不一样而已了。 Buffer是Vim自带的多文件编辑方式,有了它其实你...参考:Vim 多文件编辑:缓冲区 注意:默认来讲,如果你...
  • 1.通道(Channel)和缓冲区(buffer) 2.非阻塞 3.选择器 通过非阻塞,线程将数据读到缓存区,是非阻塞异步的。 通过选择器,可以使多个通道在一个线程执行。 通道(Channel)和缓冲区(buffer) 通过channel连接文件、tcp、...
  • Buffer 缓冲区Java的NIO中Buffer至关重要:buffer是读写的中介,主要和NIO的通道交互。数据是通过通道读入缓冲区和从缓冲区写入通道的。其实缓冲区buffer的本质就是一块可以读写的内存块。这块内存块被包装成NIO的...
  • /**Gh0st远程控制源码摘取 翻译修改***///缓冲器类 class Buffer ... 功能 : 清空缓冲区 参数 : 返回值: 时间 :2014/01/26*/ void ClearBuffer(); /*函数说明: 功能 : 删除缓
  • const buf01 = Buffer.alloc(10); console.log(buf01.toString()) const buf02 = Buffer.from([10,20,30]); console.log(buf02.toString()) ...console.log(buf03.toString()) //从缓冲区读取数据 var mn = Buffer.
  • Node.js Buffer(缓冲区)

    千次阅读 2016-08-28 10:58:52
    因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存。在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js带来了一种存储原始数据的方法,可以让 Node...
  • Buffer overflows 缓冲区溢出

    千次阅读 2016-02-18 10:41:40
    Buffer overflows 缓冲区溢出 } 软件安全最大的威胁----缓冲区溢出 } 缓冲区溢出导致的问题已经数十年了,最著名的例子是1988年的网络蠕虫 } 1999年CERT/CC公示显示,所有严重的安全漏洞有50%是缓冲区溢出导致...
  • Stencil Buffer(模板缓冲区

    万次阅读 2014-10-10 10:09:48
    作者:Nin+.Lee邮箱:lilei9110@gmail.com(红色部分为自己修改)与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。这个值的具体意义视程序的具体应用而定。在渲染的过程中,...
  • 通道(Channel)与缓冲区Buffer

    万次阅读 2019-12-13 01:06:47
    通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理 缓冲区...
  • 缓冲区的4个概念: position :当前位置 mark :标记位置(可以reset直接跳到标记位置) limit :允许读取的位置 capacity:缓冲区大小 缓冲区的使用相当于position的移动(最大到limit位置)每读多少就移动...
  • innodb insert buffer 插入缓冲区

    千次阅读 2016-09-08 15:49:55
    今天在做一个大业务的数据删除时,看到下面的...插入缓冲,并不是缓存的一部分,而是物理页,对于非聚集索引的插入或更新操作,不是每一次直接插入索引页.而是先判断插入的非聚集索引页是否在缓冲池中.如果在,则直接插入,如
  • 环形缓冲区的应用ringbuffer

    千次阅读 2017-03-24 20:46:49
    环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。 1、环形缓冲区的实现原理 环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可...
  • 一. 官网说明 Memory Architecture http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/memory.htm#i10221  The database bu
  • 【NIO】Buffer缓冲区

    千次阅读 2018-02-16 21:41:22
    前言 ... Project:java-nio ...数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象, 并提供了一组方法,用来方...
  • 在文件系统中,有三大缓冲为了提升效率:inode缓冲区、dentry缓冲区、块缓冲。 (内核:2.4.37)
  • RingBuffer环形缓冲区的数值操作

    千次阅读 2018-04-11 16:50:20
    环形缓冲区
  • Java NIO —— Buffer缓冲区

    千次阅读 2016-08-18 16:46:11
    Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区。注意:Buffer是非线程安全类。capacity一旦初始化后就不会改变,其值一直为常量。在使用中我们一般使用Buffer的抽象子类ByteBuffer.allocate()方法,实际上...
  • 学习的过程总是枯燥无畏的,但是你也必须勇往直前,量变引起质变是亘古不变的道理。目录1萨达十大目录2大方法二房
  • Vim的Buffer/缓冲区,文件

    千次阅读 2017-09-12 15:55:32
    顾名思义, Buffer 是内存中的一块缓冲区域,用于临时存放Vim打开过的文件。用Vim打开文件后,文件就自动被加入到Buffer队列中,而且Buffer中永远是最新的版本,修改文件后还未保存时,改动就存在于Buffer中。打开...
  • JDK1.8源码分析:NIO缓冲区Buffer

    千次阅读 2018-12-30 23:25:37
    Buffer接口是Java NIO的缓冲区的基础接口,定义了缓冲区操作的相关控制属性和操作方法。缓冲区是一个存放特定基础类型数据,如byte, char, int, long, float, double(不能是boolean),的容器,物理上是一个有界的...
  • Buffer缓冲区)常用方法整理

    千次阅读 2018-11-23 15:07:02
    Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buff...

空空如也

1 2 3 4 5 ... 20
收藏数 138,848
精华内容 55,539
关键字:

buffer