• JavaNIO缓冲区


    package com.nio.test;
    
    import java.nio.ByteBuffer;
    
    import org.junit.Test;
    
    /**
     * 
     * @author fliay
     *
     *	一、缓冲区(buffer)
     *	根据数据类型不同(boolean)除外,提供了相应类型的缓冲区;
     *	ByteBuffer
     *	CharBuffer
     *	ShortBuffer
     *	IntBuffer
     *	LongBuffer
     *	FloatBuffer
     *	BoubleBuffer
     *	上述缓冲区的管理方式几乎一致,通过allocate() 获取缓冲区
     *
     *	二、缓冲区存取数据的两个核心方法:
     *		1.put(): 存入数据到缓冲区中
     *		2.get(): 获取缓冲区中的数据
     *	
     *	三、缓冲区中的四个核心属性:
     *		1.capacity: 容量,表示缓冲区最大存储数据的容量。
     *		2.limit:	界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
     *		3.position:	位置,表示缓冲区中正在操作数据的位置。
     *		4.mark:		标记,表示记录当前position的位置,可以通过reset() 恢复到mark的位置		
     *
     *
     *		0 <= mark <= position <= limit <= capacity
     *
     */
    
    
    
    public class TestBuffer {
    	
    	
    	@Test
    	public void test1(){
    		
    		String str = "abcde";
    		//1.分配一个指定大小的缓冲区
    		ByteBuffer buf = ByteBuffer.allocate(1024);
    		
    		System.out.println("------------------allocate(分配指定大小的缓冲区)-------------------");
    		System.out.println("position(正在操作数据位置):"+buf.position());
    		System.out.println("limit(可以操作数据的大小):"+buf.limit());
    		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
    		
    		//2.利用put() 存入数据到缓冲区
    		buf.put(str.getBytes());
    		
    		System.out.println("------------------put(存入数据到缓冲区)-------------------");
    		System.out.println("position(正在操作数据位置):"+buf.position());
    		System.out.println("limit(可以操作数据的大小):"+buf.limit());
    		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
    		
    		//3.切换读取数据数据模式
    		buf.flip();
    		
    		System.out.println("------------------flip(切换读取数据模式)-------------------");
    		System.out.println("position(正在操作数据位置):"+buf.position());
    		System.out.println("limit(可以操作数据的大小):"+buf.limit());
    		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
    		
    		//4.利用get() 读取缓冲区中的数据
    		System.out.println("------------------get读取缓冲区中的数据-------------------");
    		byte[]	s = new byte[buf.limit()];
    		buf.get(s);
    		System.out.println("读取缓冲区中的数据:"+new String(s,0,s.length));
    		
    		System.out.println("------------------get(读取缓冲区中的数据)-------------------");
    		System.out.println("position(正在操作数据位置):"+buf.position());
    		System.out.println("limit(可以操作数据的大小):"+buf.limit());
    		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
    		
    		//5.rewind()可重复读
    		buf.rewind();
    		System.out.println("------------------rewind(重置可操作数据/可重复读)-------------------");
    		System.out.println("position(正在操作数据位置):"+buf.position());
    		System.out.println("limit(可以操作数据的大小):"+buf.limit());
    		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
    		
    		//6.clear() 清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态
    		buf.clear();
    		System.out.println("------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------");
    		System.out.println("position(正在操作数据位置):"+buf.position());
    		System.out.println("limit(可以操作数据的大小):"+buf.limit());
    		System.out.println("capacity(最大存储数据容量):"+buf.capacity());
    		
    	}
    	
    	@Test
    	public void test2(){
    		String str="abcde";
    		ByteBuffer buf = ByteBuffer.allocate(1024);
    		buf.put(str.getBytes());
    		buf.flip();
    		byte[] b = new byte[buf.limit()];
    		buf.get(b,0,2);
    		System.out.println(new String(b,0,2));
    		System.out.println(buf.position());
    		//mark()标记
    		buf.mark();
    		System.out.println("------------------mark 标记后-------------------");
    		buf.get(b, 2, 2);
    		System.out.println(new String(b,2,2));
    		System.out.println(buf.position());
    		
    		System.out.println("------------------reset 恢复到mark的位置-------------------");
    		//reset 恢复到mark的位置
    		buf.reset();
    		System.out.println(buf.position());
    		//判断缓冲区中是否还有剩余数据
    		if(buf.hasRemaining()){
    			System.out.println("------------------获取缓冲区中所有剩余数据-------------------");
    			System.out.println(buf.remaining());
    			
    			System.out.println("缓冲区中的剩余数据:"+new String(b,buf.position(),buf.remaining()));
    		}
    		
    	}
    	
    	
    
    }
    

      输出结果

    ------------------allocate(分配指定大小的缓冲区)-------------------
    position(正在操作数据位置):0
    limit(可以操作数据的大小):1024
    capacity(最大存储数据容量):1024
    ------------------put(存入数据到缓冲区)-------------------
    position(正在操作数据位置):5
    limit(可以操作数据的大小):1024
    capacity(最大存储数据容量):1024
    ------------------flip(切换读取数据模式)-------------------
    position(正在操作数据位置):0
    limit(可以操作数据的大小):5
    capacity(最大存储数据容量):1024
    ------------------get读取缓冲区中的数据-------------------
    读取缓冲区中的数据:abcde
    ------------------get(读取缓冲区中的数据)-------------------
    position(正在操作数据位置):5
    limit(可以操作数据的大小):5
    capacity(最大存储数据容量):1024
    ------------------rewind(重置可操作数据/可重复读)-------------------
    position(正在操作数据位置):0
    limit(可以操作数据的大小):5
    capacity(最大存储数据容量):1024
    ------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------
    position(正在操作数据位置):0
    limit(可以操作数据的大小):1024
    capacity(最大存储数据容量):1024
    ab
    2
    ------------------mark 标记后-------------------
    cd
    4
    ------------------reset 恢复到mark的位置-------------------
    2
    ------------------获取缓冲区中所有剩余数据-------------------
    3
    缓冲区中的剩余数据:cd
    

      

  • 相关阅读:
    如何用js刷新aspxgridviw
    ASPxSpinEdit 控件的三元判断
    关于cookie
    asp.net解决数据转换为DBNULL的问题
    Devexpress 中如何写ASPxGridView新增修改时的数据验证
    ASPxGridView中批量提交及个别提交的写法
    c#中如何做日期的三元判断(日期不为空赋值)
    c#中如何不通过后台直接用js筛选gridview中的数据条件筛选查询?
    devexpress中如何绑定ASPxTreeList控件
    如何在后台动态生成ASPxCheckBoxList标签并循环(数据调用存储过程)
  • 原文地址:https://www.cnblogs.com/fliay/p/7271090.html
Copyright © 2020-2023  润新知