java nio中几个重要的属性

最近学习一下Java NIO非阻塞式IO,下面是NIO中几个重要的属性和方法,方便大家理解

/**
 * nio 非阻塞IO
 * nio核心 Channel,Buffer 和 Selector 
 * 
 * 1.缓冲区buffer:在nio中负责数据的存取,缓冲区就是数据,用于存储不同的数据类型
 * 
 * 数据类型不同(boolean除外),提供对应的缓冲区,其实就是数组
 * ByteBuffer
 * CharBuffer
 * ShortBuffer
 * IntBuffer
 * LongBuffer
 * FloatBuffer
 * DoubleBuffer
 * 
 * 都是通过allocate()获取缓冲区
 * 
 * 2.缓冲区中连个重要方法
 * put():存入数据导缓冲区
 * get():从缓冲区获取数据
 * 
 * 3.缓冲区中四个属性
 * capacity:容量,表示缓冲区最大存储数据的容量,一旦创建不能改变
 * limit:界限,表示缓冲区中可以操作数据的大小。写模式下,limit等于Buffer的capacity,当切换Buffer到读模式时, limit表示你最多能读到多少数据
 * position:位置,表示缓冲区中正在操作数据的位置。从0开始
 * mark:标记,记录当前position的位置,可以通过reset()恢复到mark的位置。
 * 
 * 0<=mark<=position<=limit<=capacity
 * 
 */
public class NioParam {

    @Test
    public void positionLimitCapacity() {
        ByteBuffer buf = ByteBuffer.allocate(1024);
        
        System.out.println("-----------allocate初始大小-------");
        System.out.println("capacity="+buf.capacity());
        System.out.println("limit="+buf.limit());
        System.out.println("position="+buf.position());
        
        //利用put写入数据
        System.out.println("-----------put-------");
        String src = "abcde";
        buf.put(src.getBytes());
        System.out.println("capacity="+buf.capacity());
        System.out.println("limit="+buf.limit());
        System.out.println("position="+buf.position());

        //flip切换读取模式
        System.out.println("-----------flip-------");
        buf.flip();
        System.out.println("capacity="+buf.capacity());
        System.out.println("limit="+buf.limit());
        System.out.println("position="+buf.position());
        
        //get读取缓冲区的数据
        System.out.println("-----------get-------");
        byte[] dst = new byte[buf.limit()];
        buf.get(dst);
        System.out.println(new String(dst,0,dst.length));
        System.out.println("capacity="+buf.capacity());
        System.out.println("limit="+buf.limit());
        System.out.println("position="+buf.position());
        
        //rewind重复读
        System.out.println("-----------rewind-------");
        buf.rewind();
        System.out.println("capacity="+buf.capacity());
        System.out.println("limit="+buf.limit());
        System.out.println("position="+buf.position());
        
        //clear清空缓冲区
        System.out.println("-----------clear-------");
        buf.clear();
        System.out.println("capacity="+buf.capacity());
        System.out.println("limit="+buf.limit());
        System.out.println("position="+buf.position());
        
        //但是缓冲区中的数据还存在,但是出于“被遗忘”状态
//        System.out.println((char)buf.get());
    }

    
    @Test
    public  void mark() {
        ByteBuffer buf = ByteBuffer.allocate(1024);
        String str = "abcde";
        
        buf.put(str.getBytes());
        
        buf.flip();
        byte[] dst = new byte[buf.limit()];
        buf.get(dst, 0, 2);
        
        System.out.println(new String(dst));
        System.out.println(buf.position());
        
        //mark标记
        buf.mark();
        
        buf.get(dst, 2, 2);
        System.out.println(new String(dst));
        System.out.println(buf.position());
        
        //reset恢复到mark的位置
        buf.reset();
        System.out.println(buf.position());
        
        //判断缓冲区中是否还有可操作的数据
        if (buf.hasRemaining()) {
            //看看还有多少剩余数据
            System.out.println(buf.remaining());
        }
    }

    
}

运行效果:

猜你喜欢

转载自blog.csdn.net/yin767833376/article/details/81388968