zoukankan      html  css  js  c++  java
  • Buffer的数据存取

    缓冲区 存放要读取的数据    

    缓冲区 和 通道 配合使用

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

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

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

    ByteBuffer (用的最多 )

    CharBuffer

    ShortBuffer

    IntBuffer

    LongBuffer

    FloatBuffer

    DoubleBuffer

    Buffer的概述

    参数:

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

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

    3)位置(position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制(limit)。    缓冲区正在操作的位置 默认从0开始

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

     方法:

      put( ) 往buffer存放数据

      get () 获取数据

    看源码中的四个核心参数:

        @Test
        public void Test01() {
            //初始化 byteBuffer的大小
          ByteBuffer byteBuffer = ByteBuffer.allocate(10323); 
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("buffer中存放数据");
            byteBuffer.put("add".getBytes());
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            
        }

     

    limit 表示 现在limit 里面

    @Test
        public void Test01() {
            //初始化 byteBuffer的大小
          ByteBuffer byteBuffer = ByteBuffer.allocate(10323); 
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("buffer中存放数据");
            byteBuffer.put("add".getBytes());
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            //开启读取模式   讲position设为0   不开启就从当前 position位置开始读取,会报错
            byteBuffer.flip();
            byte[] bytes = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes);
            System.out.println(new String(bytes,0,bytes.length));
        }

    解决重复读取:

    @Test
        public void Test01() {
            //初始化 byteBuffer的大小
          ByteBuffer byteBuffer = ByteBuffer.allocate(10323); 
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("buffer中存放数据");
            byteBuffer.put("add".getBytes());
            //开启读取模式   讲position设为0   不开启就从当前 position位置开始读取,会报错 。 读取完毕时候 position会还原
            System.out.println("开启读取。。。。");
            byteBuffer.flip();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes);
            System.out.println(new String(bytes,0,bytes.length));
            System.out.println("重复读取");
            byteBuffer.rewind();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes1 = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes1);
            System.out.println(new String(bytes1,0,bytes1.length));
            
            
            
        }

    清空:

        @Test
        public void Test01() {
            //初始化 byteBuffer的大小
          ByteBuffer byteBuffer = ByteBuffer.allocate(10323); 
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("buffer中存放数据");
            byteBuffer.put("add".getBytes());
            //开启读取模式   讲position设为0   不开启就从当前 position位置开始读取,会报错 。 读取完毕时候 position会还原
            System.out.println("开启读取。。。。");
            byteBuffer.flip();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes);
            System.out.println(new String(bytes,0,bytes.length));
            System.out.println("重复读取");
            byteBuffer.rewind();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes1 = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes1);
            System.out.println(new String(bytes1,0,bytes1.length));
            System.out.println("清空缓存区");
            byteBuffer.clear();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes11 = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes11);
            System.out.println(new String(bytes11,0,bytes11.length));
            
            
            
        }

    清空缓冲区,名义上其实是把 下标修改了 但是值还是存在的 数值遗忘

    看看最终版本:

    @Test
        public void Test01() {
            //初始化 byteBuffer的大小
          ByteBuffer byteBuffer = ByteBuffer.allocate(1024); 
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("buffer中存放数据");
            byteBuffer.put("addNew".getBytes());
            //开启读取模式   讲position设为0   不开启就从当前 position位置开始读取,会报错 。 读取完毕时候 position会还原
            System.out.println("开启读取。。。。");
            byteBuffer.flip();
            System.out.println("读取buffer值");
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            byte[] bytes = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes);
            System.out.println(new String(bytes,0,bytes.length));
            System.out.println("重复读取");
            byteBuffer.rewind();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes1 = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes1);
            System.out.println(new String(bytes1,0,bytes1.length));
            System.out.println("清空缓存区");
            byteBuffer.clear();
            System.out.println(byteBuffer.position());   //默认0
            System.out.println(byteBuffer.limit());      
            System.out.println(byteBuffer.capacity());
            System.out.println("读取buffer值");
            byte[] bytes11 = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes11);
            System.out.println(new String(bytes11,0,bytes11.length));
            
            
            
        }

    上述缓冲区管理的方式几乎

     * 通过allocate()获取缓冲区

     * 二、缓冲区核心的方法 put 存入数据到缓冲区 get <br>获取缓冲区数据 flip 开启读模式

     * 三、缓冲区四个核心属性

     * capacity:缓冲区最大容量,一旦声明不能改变。 limit:界面(缓冲区可以操作的数据大小) limit后面的数据不能读写。

     * position:缓冲区正在操作的位置

     

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

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

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

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

  • 相关阅读:
    867. Transpose Matrix
    896. Monotonic Array
    Java并发包中线程池ThreadPoolExecutor原理探究
    Java中的线程协作之Condition
    Java中的读写锁
    Java中的锁——Lock和synchronized
    Java中的队列同步器AQS
    Java并发编程基础之volatile
    leetcode-数组中只出现一次的数字
    leetcode-比特位计数
  • 原文地址:https://www.cnblogs.com/toov5/p/9931312.html
Copyright © 2011-2022 走看看