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

  • 缓冲区(Buffer):

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

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

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

  1. ByteBuffer

  2. CharBuffer

  3. ShortBuffer

  4. IntBuffer

  5. LongBuffer

  6. FloatBuffer

  7. DoubleBuffer

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

static XxxBuffer allocate(int capacity)

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

  • Buffer中的重要概念:

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)的数据存取详解编程语言

 

  •  Buffer常用函数测试: 

 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         // 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
  • mark与reset的用法:

 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

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论