• Java NIO的基本概念与使用


    public class TestBuffer {
    
    <span style="color:#808080;"><em>/**
    

    * . 缓冲区 (Buffer):Java Nio中负责数据的 存取+缓冲就是数组.用于存储不同类型的数据
    *
    * 根据类型不同(boolean 除外) 都提供了对应的缓冲区
    * ByteBuffer
    * CharBuffer
    * ShortBuffer
    *
    * LongBuffer
    * FloatBuffer
    * DoubleBuffer
    *
    * 上述缓冲区的管理方式 几乎一致 通过allocate()获取缓冲区
    *
    * .缓冲区存取数据的两个核心方法
    * put():存入数据到缓冲区中
    * get():获取 缓冲区中的数据
    *
    *
    * .缓冲区4个核心方法(Class:Buffer)
    * 1.capacity 容量,表示缓冲区中最大存储的容量 一旦声明不能改写
    * 2.limit 界限, 表示缓冲区可以操作数据的大小.(limit 后数据不能进行读写)
    * 3.position 位置,表示缓冲区 正在操作数据的位置
    * 4.mark 标记 表示当前position的位置 可以通过reset()恢复到 mark的位置
    *
    * 0 <=mark<= position<= limit<=capacity
    *
    * .直接缓冲区与非直接缓冲区:
    * 非直接缓冲区:通过 allocate() 方法分配缓冲区, 将缓冲区建立在JVM的内存中
    * 直接缓冲区: 通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中.可以提高效率
    */

    public static void main(String[] args){
    String str= "Hello world";

        <span style="color:#808080;"><em>//1.</em></span><span style="color:#808080;font-family:'宋体';"><em>分配一个大小
    

    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
    System.out.println("--------------allocate初始化大小---------------");
    System.out.println("position:"+byteBuffer.position());
    System.out.println("limit:"+byteBuffer.limit());
    System.out.println("capacity:"+byteBuffer.capacity());

        <span style="color:#808080;"><em>//2.</em></span><span style="color:#808080;font-family:'宋体';"><em>使用</em></span><span style="color:#808080;"><em>Put()</em></span><span style="color:#808080;font-family:'宋体';"><em>方法 存入缓冲区数据
    

    byteBuffer.put(str.getBytes());
    System.out.println("--------------allocate存入数据后的变化---------------");
    System.out.println("position:"+byteBuffer.position());
    System.out.println("limit:"+byteBuffer.limit());
    System.out.println("capacity:"+byteBuffer.capacity());

        <span style="color:#808080;"><em>//3.</em></span><span style="color:#808080;font-family:'宋体';"><em>如要读取数据 需要切换模式 调用</em></span><span style="color:#808080;"><em>flip()
    

    byteBuffer.flip();

        System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"--------------allocate</strong></span><span style="color:#008000;font-family:'宋体';"><strong>切换为读取模式的变化</strong></span><span style="color:#008000;"><strong>---------------"</strong></span>);
        System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"position:"</strong></span>+byteBuffer.position());
        System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"limit:"</strong></span>+byteBuffer.limit());
        System.<span style="color:#660e7a;"><strong><em>out</em></strong></span>.println(<span style="color:#008000;"><strong>"capacity:"</strong></span>+byteBuffer.capacity());
    
        <span style="color:#808080;"><em>//4.</em></span><span style="color:#808080;font-family:'宋体';"><em>用</em></span><span style="color:#808080;"><em>get </em></span><span style="color:#808080;font-family:'宋体';"><em>读取数据
    

    byte[] dst = new byte[byteBuffer.limit()];
    byteBuffer.get(dst);
    System.out.println(new String(dst,0,dst.length));
    System.out.println("--------------allocate切换为读取时的变化get()---------------");
    System.out.println("position:"+byteBuffer.position());
    System.out.println("limit:"+byteBuffer.limit());
    System.out.println("capacity:"+byteBuffer.capacity());

        <span style="color:#808080;"><em>//5.rewind()</em></span><span style="color:#808080;font-family:'宋体';"><em>可重复读数据
    

    byteBuffer.rewind();
    System.out.println("--------------allocate切换为读取时的变化rewind()---------------");
    System.out.println("position:"+byteBuffer.position());
    System.out.println("limit:"+byteBuffer.limit());
    System.out.println("capacity:"+byteBuffer.capacity());

        <span style="color:#808080;"><em>//6.clear() </em></span><span style="color:#808080;font-family:'宋体';"><em>清空缓冲区 但是缓冲区中的数据依然存在</em></span><span style="color:#808080;"><em>,</em></span><span style="color:#808080;font-family:'宋体';"><em>只是处于</em></span><span style="color:#808080;"><em>"</em></span><span style="color:#808080;font-family:'宋体';"><em>被遗忘</em></span><span style="color:#808080;"><em>"</em></span><span style="color:#808080;font-family:'宋体';"><em>状态
    

    byteBuffer.clear();
    System.out.println("---------------clear() 清空缓冲区--------------");
    System.out.println("position:"+byteBuffer.position());
    System.out.println("limit:"+byteBuffer.limit());
    System.out.println("capacity:"+byteBuffer.capacity());
    //读取第一个字符时 依然可以读取到
    System.out.println((char)byteBuffer.get());

    }
    

    }

    控制台输出:


    --------------allocate初始化大小---------------
    position:0
    limit:1024
    capacity:1024
    --------------allocate存入数据后的变化---------------
    position:11
    limit:1024
    capacity:1024
    --------------allocate切换为读取模式的变化---------------
    position:0
    limit:11
    capacity:1024
    Hello world
    --------------allocate切换为读取时的变化get()---------------
    position:11
    limit:11
    capacity:1024
    --------------allocate切换为读取时的变化rewind()---------------
    position:0
    limit:11
    capacity:1024
    ---------------clear() 清空缓冲区--------------
    position:0
    limit:1024
    capacity:1024
    H

  • 相关阅读:
    1061 Dating (20 分)
    1112 Stucked Keyboard (20 分)
    1077 Kuchiguse (20 分)
    1065 A+B and C (64bit) (20 分)
    1046 Shortest Distance (20 分)
    1124 Raffle for Weibo Followers (20 分)
    1036 Boys vs Girls (25 分)
    1113 Integer Set Partition (25 分)
    f开头的
    g开头的
  • 原文地址:https://www.cnblogs.com/jpfss/p/10118363.html
Copyright © 2020-2023  润新知