zl程序教程

您现在的位置是:首页 >  后端

当前栏目

NIO之缓冲区(Buffer)的数据存取详解编程语言

nio数据编程语言 详解 Buffer 存取 缓冲区
2023-06-13 09:20:45 时间

一个用于特定基本数据类行的容器。有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类。

Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道读入到缓冲区,从缓冲区写入通道中的。

Buffer就像一个数组,可以保存多个相同类型的数据。根据类型不同(boolean除外),有以下Buffer常用子类:


上述Buffer类他们都采用相似的方法进行管理数据,只是各自管理的数据类型不同而已,都是通过以下方法获取一个Buffer对象:

static XxxBuffer allocate(int capacity)

创建一个容量为capacity的XxxBuffer对象。


1)容量(capacity):表示Buffer最大数据容量,缓冲区容量不能为负,并且建立后不能修改。

2)限制(limit):第一个不应该读取或者写入的数据的索引,即位于limit后的数据不可以读写。缓冲区的限制不能为负,并且不能大于其容量(capacity)。

3)位置(position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制(limit)。

4)标记(mark)与重置(reset):标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。

java. nio.Buffer.java

 注意:0 =mark =position =capacity

测试代码:

 1 package com.dx.nios; 

 2 

 3 import java.nio.ByteBuffer; 

 4 

 5 import org.junit.Test; 

 6 

 7 public class BufferTest { 

 8 

 9 @Test 

10 public void TestBuffer() { 

11 ByteBuffer byteBuffer = ByteBuffer.allocate(10); 

12 

13 System.out.println( ------------allocate------------------  

14 System.out.println(byteBuffer.position()); 

15 System.out.println(byteBuffer.limit()); 

16 System.out.println(byteBuffer.capacity()); 

17 

18 

19 byteBuffer.put( abcde .getBytes()); 

20 

21 System.out.println( ------------put------------------  

22 System.out.println(byteBuffer.position()); 

23 System.out.println(byteBuffer.limit()); 

24 System.out.println(byteBuffer.capacity()); 

25 

26 byteBuffer.flip(); 

27 

28 System.out.println( ------------flip------------------  

29 System.out.println(byteBuffer.position()); 

30 System.out.println(byteBuffer.limit()); 

31 System.out.println(byteBuffer.capacity()); 

32 

33 } 

34 }

输出结果:

------------allocate------------------ 

0 

10 

10 

------------put------------------ 

5 

10 

10 

------------flip------------------ 

0 

5 

10

分析:

NIO之缓冲区(Buffer)的数据存取详解编程语言

NIO之缓冲区(Buffer)的数据存取详解编程语言

 


10 public void TestBuffer() {  11 // 1.使用allocate()申请10个字节的缓冲区  12 ByteBuffer byteBuffer = ByteBuffer.allocate(10);  13 System.out.println( ------------allocate------------------   14 System.out.println(byteBuffer.position());  15 System.out.println(byteBuffer.limit());  16 System.out.println(byteBuffer.capacity());  17  18 // 2.使用put()存放5个字节到缓冲区  19 byteBuffer.put( abcde .getBytes());  20 System.out.println( ------------put------------------   21 System.out.println(byteBuffer.position());  22 System.out.println(byteBuffer.limit());  23 System.out.println(byteBuffer.capacity());  24  25 // 3.切换到读取数据模式  26 byteBuffer.flip();  27 System.out.println( ------------flip------------------   28 System.out.println(byteBuffer.position());  29 System.out.println(byteBuffer.limit());  30 System.out.println(byteBuffer.capacity());  31  32 // 4.从缓冲区中读取数据  33 System.out.println( ------------get------------------   34 byte[] bytes = new byte[byteBuffer.limit()];  35 byteBuffer.get(bytes);  36 System.out.println(new String(bytes, 0, bytes.length));  37 System.out.println(byteBuffer.position());  38 System.out.println(byteBuffer.limit());  39 System.out.println(byteBuffer.capacity());  40  41 // 5.设置为可重复读取  42 System.out.println( ------------rewind------------------   43 byteBuffer.rewind();  44 System.out.println(byteBuffer.position());  45 System.out.println(byteBuffer.limit());  46 System.out.println(byteBuffer.capacity());  47 byte[] bytes2 = new byte[byteBuffer.limit()];  48 byteBuffer.get(bytes2);  49 System.out.println(new String(bytes2, 0, bytes2.length));  50 System.out.println(byteBuffer.position());  51 System.out.println(byteBuffer.limit());  52 System.out.println(byteBuffer.capacity());  53  54 // 6。clear清空缓存区,但是内容没有被清掉,还存在。只不过这些数据状态为被遗忘状态。  55 System.out.println( ------------clear------------------   56 byteBuffer.clear();  57 System.out.println(byteBuffer.position());  58 System.out.println(byteBuffer.limit());  59 System.out.println(byteBuffer.capacity());  60 byte[] bytes3 = new byte[10];  61 byteBuffer.get(bytes3);  62 System.out.println(new String(bytes3, 0, bytes3.length));  63 }  64 }

输出:

 1 ------------allocate------------------ 

 2 0 

 3 10 

 4 10 

 5 ------------put------------------ 

 6 5 

 7 10 

 8 10 

 9 ------------flip------------------ 

10 0 

11 5 

12 10 

13 ------------get------------------ 

14 abcde 

15 5 

16 5 

17 10 

18 ------------rewind------------------ 

19 0 

20 5 

21 10 

22 abcde 

23 5 

24 5 

25 10 

26 ------------clear------------------ 

27 0 

28 10 

29 10 

30 abcde

 1 @Test 

 2 public void testMark() { 

 3 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); 

 4 byteBuffer.put( abcde .getBytes()); 

 5 byteBuffer.flip(); 

 6 

 7 byte[] bytes = new byte[byteBuffer.limit()]; 

 8 byteBuffer.get(bytes, 0, 2); 

 9 System.out.println(new String(bytes, 0, bytes.length)); 

10 

11 System.out.println(byteBuffer.position()); 

12 System.out.println(byteBuffer.limit()); 

13 System.out.println(byteBuffer.capacity()); 

14 

15 byteBuffer.mark(); 

16 System.out.println( ---------mark----------  

17 

18 byteBuffer.get(bytes, 0, 2); 

19 System.out.println(new String(bytes, 0, bytes.length)); 

20 

21 System.out.println(byteBuffer.position()); 

22 System.out.println(byteBuffer.limit()); 

23 System.out.println(byteBuffer.capacity()); 

24 

25 byteBuffer.reset(); 

26 System.out.println( ---------reset----------  

27 

28 System.out.println(byteBuffer.position()); 

29 System.out.println(byteBuffer.limit()); 

30 System.out.println(byteBuffer.capacity()); 

31 }

打印信息:

ab
2
5
1024
mark -
cd
4
5
1024
reset -
2
5
1024

 

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15746.html

cjava