关于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<ByteBuffer>
final by...
本文实例讲述了Android在JNI
中使用
ByteBuffer的
方法。分享给大家供大家参考。具体如下:
一、
ByteBuffer 定义
在NIO
中,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区)
缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型。
ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的
方法,且信道的读写
方法只接收
ByteBuffer。
ByteBuffer有以下几种常见属性:
mark:初始值为-1,标记索引地点;
position:初始值为0,索引下标;
ios-byteBuffer
[]( Lee / ios-byteBuffer )
ByteBuffer *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对象,以便更轻松地处理和修改数据。