相关文章推荐
知识渊博的扁豆  ·  Java ...·  1 月前    · 
心软的黑框眼镜  ·  JAVA基础 - ...·  1 年前    · 
想发财的脸盆  ·  ByteBuffer.clear()_Bin ...·  1 年前    · 
谦虚好学的口罩  ·  Grails / GORM: ...·  1 年前    · 
叛逆的木瓜  ·  jenkins高级篇 pipeline ...·  1 年前    · 

关于flip,看到JDK的文档大概是这么说的:“将limit属性设置为当前的位置”;而关于rewind方法,是在limit属性已经被设置合适的情况下使用的。也就是说这两个方法虽然都能够使指针返回到缓冲区的第一个位置,但是flip在调整指针之前,将limit属性设置为当前位置。以下程序可以验证:

package com.example.tests;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
public class TestBuffer {
    private static final int BSIZE = 1024; // 缓冲区大小
    public static void main(String[] args) {
        ByteBuffer bb = ByteBuffer.allocate(BSIZE);
        IntBuffer ib = bb.asIntBuffer();  // 构建整型缓冲区
        ib.put(new int[]{11, 42, 47, 99, 143, 811, 1016}); // 7 个数字
        System.out.println(ib.get(3)); // 输出 99
        ib.put(3, 1811);
        System.out.println(ib.get(3)); // 输出 1811
        ib.flip(); // 将缓冲区的limit属性设置为当前位置,并返回缓冲区的第一个位置;
        // ib.rewind(); // 返回缓冲区的第一个位置;
        System.out.println(ib.limit()); // 如果前面调用flip,则输出 7; 如果调用的是rewind,则输出256
        System.out.println("Output int buffer content: ");
        while (ib.hasRemaining()) {
            int i = ib.get();
            System.out.println(i);

如果将ib.flip() 换成ib.rewind()的话,我们会看到除了打印出数组中我们设置的内容之外,还会在后面打印出一系列自动设置的零值。

关于flip,看到JDK的文档大概是这么说的:“将limit属性设置为当前的位置”;而关于rewind方法,是在limit属性已经被设置合适的情况下使用的。也就是说这两个方法虽然都能够使指针返回到缓冲区的第一个位置,但是flip在调整指针之前,将limit属性设置为当前位置。以下程序可以验证:package com.example.tests;import java.nio.ByteBu... // Invariants: mark <= position <= limit <= capacity private int mark = -1;//标记位置,reset时需要 private int position = 0;//当前读取 private int limit;//...
java.nio.ByteBuffer 1. ByteBuffer的参数position、limit、capacity、mark含义: position:表示当前指针的位置(下一个要操作的数据元素的位置) limit:表示当前数组最大的使用量,即有效位置的EOF位置(缓冲区数组不可操作的下一个元素的位置,limit<=capacity) capacity:表示缓冲区最大...
我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。  1、有一个文件共有20个字符:      abcdefghijklmnopqrst  2、我们声明一个char[15] buffer 大小的字符数组  Java代码    for(readChar(buffer...
转载自:http://www.blogjava.net/sdjxsgb/archive/2013/06/18/400703.html 对缓冲区的读写操作首先要知道缓冲区的下限、上限和当前位置。下面这些变量的值对Buffer类的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限。 position:代表对缓冲区进行读写时,当前游标的位置。
Buffer 类定义了一个可以线性存放primitive type数据的容器接口。Buffer主要包含了与类型(byte, char…)无关的功能。 值得注意的是Buffer及其子类都不是线程安全的。每个Buffer都有以下的属性: 1. capacity 这个Buffer最多能放多少数据。capacity一般在buffer被创建的时候指定。 2. limit 在Buffer上进行的读写操
public static void main(String[] args) { try (FileChannel channel = new FileInputStream("data.txt").getChannel()){ // 定义缓冲区 allocate分配大小 ByteBuffer buffer = ByteBuffer.allocate(10); while(tr
对缓冲区的读写操作首先要知道缓冲区的下限、上限和当前位置。下面这些变量的值对Buffer类的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限。 position:代表对缓冲区进行读写时,当前游标的位置。 capacity:代表缓冲区的最大容量(一般新建一个缓冲区的时候,limit的值和capacity的值默认是相等的)。 fli...
最近在对一个thrift的service端进行自动化测试,做了一个thrift的client端,client端需要传一个装有由protobuf实例序列化byte数组的ByteBuffer,实现方法为: ByteBuffer key=ByteBuffer.allocate(p2q.toByteArray().length); key.put(p2q.toByteArray());
关于缓冲器ByteBuffer的三个方法flip(),clear(),remind()。 [b]一、[/b]flip():反转此缓冲区,将限制设置为当前位置,然后将位置设置为 0 ! 之前的写操作会不断更新当前位置,当写操作完成之后,需调用此方法,将限制位置设置为当前位置,将当前位置设置为0,这样下一个读操作会从0开始,直到限制位置。 [code="java"]
ByteBuffer继承于Buffer。 使用一个字节数组作为缓冲器。读取的数据和发送的数据会放入字节数组hb。当数组达到一定大小,一次性写入通道或者读取。避免每次操作都要进行读写操作。 public abstract class ByteBuffer extends Buffer implements Comparable&lt;ByteBuffer&gt; final by...
本文实例讲述了Android在JNI使用ByteBuffer方法。分享给大家供大家参考。具体如下: 一、ByteBuffer 定义 在NIO,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区) 缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型。ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBufferByteBuffer有以下几种常见属性: mark:初始值为-1,标记索引地点; position:初始值为0,索引下标;
ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBufferByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( void )put:( Byte )b; - ( void )putByteBuffer:(ByteBuffer*)bb; - ( void )putData:( NSData *)data; - ( void )putShort:( short )d; - ( void )putFloat:( float )f; - ( void )putInt:( int )i; - ( Byte )get:( int )index;
缓冲区(Buffer)就是在内存预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数 举个简单的例子,比如A地有1w块砖要搬到B地
ByteBuffer的wrap方法是一个静态方法,它允许将byte数组包装成ByteBuffer对象。这里的"包装"意味着创建一个新的ByteBuffer对象,但是它们都共享相同的数据存储区域。这意味着对原始byte数组的修改将反映在包装后的ByteBuffer对象。 要使用wrap方法创建一个ByteBuffer对象,可以使用如下代码: byte[] myArray = new byte[10]; ByteBuffer myBuffer = ByteBuffer.wrap(myArray); 在这个例子,我们创建了一个新的byte数组并将其包装成ByteBuffer对象。现在,我们可以使用ByteBuffer的put和get方法向数组写入和读取数据。 值得注意的是,当使用wrap方法包装一个byte[]数组时,任何对ByteBuffer对象的修改都会反映在原始byte[]数组。这在处理大型数据时可以提高性能,因为ByteBuffer对象和原始数组之间的数据传输是零拷贝的。 总之,ByteBuffer的wrap方法是一个非常方便的方法,它允许将byte数组转换为ByteBuffer对象,以便更轻松地处理和修改数据。