NIO系列——缓冲区(Buffer)

Java NIO系统的核心在于:

            通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。

            若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。

            然后操作缓冲区,对数据进行处理。

            简而言之,Channel 负责传输, Buffer 负责存储

概念:

  缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据

        一个用于特定基本数据类型的容器。由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。Java NIO 中的 Buffer 主要用于与 NIO 通道进行

        交互,数据是从通道读入缓冲区,从缓冲区写
        入通道中的。

       缓冲区的类型:

        

* 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:
* ByteBuffer
* CharBuffer
* ShortBuffer
* IntBuffer
* LongBuffer
* FloatBuffer
* DoubleBuffer
*
* 上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓冲区

* 二、缓冲区存取数据的两个核心方法:
* put() : 存入数据到缓冲区中
* get() : 获取缓冲区中的数据
*
* 三、缓冲区中的四个核心属性:
* capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。
* limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
* position : 位置,表示缓冲区中正在操作数据的位置。
*
* mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置
*
* 0 <= mark <= position <= limit <= capacity
*
* 四、直接缓冲区与非直接缓冲区:
* 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
* 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率

  1 import java.nio.ByteBuffer;
  2
  3 import org.junit.Test;
  4
  5 /*
  6  * 一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据
  7  *
  8  * 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:
  9  * ByteBuffer
 10  * CharBuffer
 11  * ShortBuffer
 12  * IntBuffer
 13  * LongBuffer
 14  * FloatBuffer
 15  * DoubleBuffer
 16  *
 17  * 上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓冲区
 18  *
 19  * 二、缓冲区存取数据的两个核心方法:
 20  * put() : 存入数据到缓冲区中
 21  * get() : 获取缓冲区中的数据
 22  *
 23  * 三、缓冲区中的四个核心属性:
 24  * capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。
 25  * limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
 26  * position : 位置,表示缓冲区中正在操作数据的位置。
 27  *
 28  * mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置
 29  *
 30  * 0 <= mark <= position <= limit <= capacity
 31  *
 32  * 四、直接缓冲区与非直接缓冲区:
 33  * 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
 34  * 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率
 35  */
 36 public class TestBuffer {
 37
 38     @Test
 39     public void test3(){
 40         //分配直接缓冲区
 41         ByteBuffer buf = ByteBuffer.allocateDirect(1024);
 42
 43         System.out.println(buf.isDirect());
 44     }
 45
 46     @Test
 47     public void test2(){
 48         String str = "abcde";
 49
 50         ByteBuffer buf = ByteBuffer.allocate(1024);
 51
 52         buf.put(str.getBytes());
 53
 54         buf.flip();
 55
 56         byte[] dst = new byte[buf.limit()];
 57         buf.get(dst, 0, 2);
 58         System.out.println(new String(dst, 0, 2));
 59         System.out.println(buf.position());
 60
 61         //mark() : 标记
 62         buf.mark();
 63
 64         buf.get(dst, 2, 2);
 65         System.out.println(new String(dst, 2, 2));
 66         System.out.println(buf.position());
 67
 68         //reset() : 恢复到 mark 的位置
 69         buf.reset();
 70         System.out.println(buf.position());
 71
 72         //判断缓冲区中是否还有剩余数据
 73         if(buf.hasRemaining()){
 74
 75             //获取缓冲区中可以操作的数量
 76             System.out.println(buf.remaining());
 77         }
 78     }
 79
 80     @Test
 81     public void test1(){
 82         String str = "abcde";
 83
 84         //1. 分配一个指定大小的缓冲区
 85         ByteBuffer buf = ByteBuffer.allocate(1024);
 86
 87         System.out.println("-----------------allocate()----------------");
 88         System.out.println(buf.position());
 89         System.out.println(buf.limit());
 90         System.out.println(buf.capacity());
 91
 92         //2. 利用 put() 存入数据到缓冲区中
 93         buf.put(str.getBytes());
 94
 95         System.out.println("-----------------put()----------------");
 96         System.out.println(buf.position());
 97         System.out.println(buf.limit());
 98         System.out.println(buf.capacity());
 99
100         //3. 切换读取数据模式
101         buf.flip();
102
103         System.out.println("-----------------flip()----------------");
104         System.out.println(buf.position());
105         System.out.println(buf.limit());
106         System.out.println(buf.capacity());
107
108         //4. 利用 get() 读取缓冲区中的数据
109         byte[] dst = new byte[buf.limit()];
110         buf.get(dst);
111         System.out.println(new String(dst, 0, dst.length));
112
113         System.out.println("-----------------get()----------------");
114         System.out.println(buf.position());
115         System.out.println(buf.limit());
116         System.out.println(buf.capacity());
117
118         //5. rewind() : 可重复读
119         buf.rewind();
120
121         System.out.println("-----------------rewind()----------------");
122         System.out.println(buf.position());
123         System.out.println(buf.limit());
124         System.out.println(buf.capacity());
125
126         //6. clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于“被遗忘”状态
127         buf.clear();
128
129         System.out.println("-----------------clear()----------------");
130         System.out.println(buf.position());
131         System.out.println(buf.limit());
132         System.out.println(buf.capacity());
133
134         System.out.println((char)buf.get());
135
136     }
137
138 }

原文地址:https://www.cnblogs.com/dreamHighMjc/p/8185217.html

时间: 2024-07-30 01:51:17

NIO系列——缓冲区(Buffer)的相关文章

Java NIO系列(二) - Buffer

前言 在Java NIO中,缓冲区用来临时存储数据,可以理解为是I/O操作中数据暂存的中转站.缓冲区直接为通道(Channel)服务,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问这块内存. 正文 Buffer的类型 Java NIO提供以下几种Buffer类型: ByteBuffer MappedByteBuffer ShortBuffer LongBuff

Java NIO系列教程(三) Buffer

原文链接:http://ifeve.com/buffers/ 声明:Java NIO系列教材并非本人原创,只因阅读原文之后有感于文章之精妙,意欲与诸位共享,故而出此下策,忘原作者见谅.另附上原文地址. Java NIO的通道类似流,但又有些不同: Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问

Java NIO系列3:缓冲区

前言 一直想把NIO系列的文章更新下去,只不过发现在入职支付宝后工作实在是忙,所以一直拖到现在.直接从一个学生过狗成为一名加班狗,好吧,这就是互联网公司的现状吧,但是每天都是充实的,而且发现其他的员工也基本非常乐意加班,难道这就是阿里的文化熏陶?! 废话不多说,还是进入今天的正题,在前面的文章中,我们已经对Java的NIO有了一个粗浅的认识--主要之为了支持非阻塞I/O的操作,之前的BIO则是阻塞的.因为异步性的引入,大大提高了Java在处理异步任务的效率.下面认识下NIO中的缓冲区: 认识缓冲

Java NIO -- 缓冲区(Buffer)的数据存取

缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的. Buffer 就像一个数组,可以保存多个相同类型的数据.根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:ByteBufferCharBuffer ShortBuffer IntBuffer LongBuffer Flo

Java NIO系列教程(三) Buffer(转)

Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 下面是NIO Buffer相关的话题列表: Buffer的基本用法 Buffer的capacity,position和limit Buffer的类型 Buffer的分配 向Buffer中写数据 flip()方法 从Buffer中读取数据

JAVA NIO系列(三) Buffer 解读

缓冲区分类 NIO中的buffer用于和通道交互,数据是从通道读入缓冲区,从缓冲区中写入通道的.Buffer就像一个数组,可以保存多个类型相同的数据.每种基本数据类型都有对应的Buffer类: 缓冲区的属性 1.capacity(容量):buffer本质是一个数组,在初始化时有固定的大小,这个值就是容量.容量不可改变,一旦缓冲区满了,需要将其清空才能将继续进行读写操作. 2.position(位置):表示当前的位置,初始化时为0,当一个基本数据类型的数据写入buffer时,position会向前

Java NIO 系列教程(转)

原文中说了最重要的3个概念,Channel 通道Buffer 缓冲区Selector 选择器其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵塞模式才加入的东西.以前的流总是堵塞的,一个线程只要对它进行操作,其它操作就会被堵塞,也就相当于水管没有阀门,你伸手接水的时候,不管水到了没有,你就都只能耗在接水(流)上.nio的Channel的加入,相当于增加了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各

Java NIO 系列教程

转载于http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO.感谢并发编程网的翻译和投递. (关注ITeye官微,随时随地查看最新开发资讯.技术文章.) Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流

Java NIO系列教程(二) Channel

原文地址:http://ifeve.com/channels/ 声明:Java NIO系列教材并非本人原创,只因阅读原文之后有感于文章之精妙,意欲与诸位共享,故而出此下策,忘原作者见谅.另附上原文地址. Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入. 正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道.如下图所示: C