让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()

简介: 这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
package nio;

import java.nio.ByteBuffer;

public class BufferTest {
    public static void main(String[] args) throws InterruptedException {
        ByteBuffer buf = ByteBuffer.allocate(9);
        System.out.println("初始capacity = " +buf.capacity());
        System.out.println("初始position = " + buf.position());
        System.out.println("初始limit = " + buf.limit());
        System.out.println("初始mark = " + buf.mark());
        buf.put("123456789".getBytes());
        System.out.println("put写之后的position = " + buf.position());
        System.out.println("put写之后的limit = " + buf.limit());
        System.out.println("put写之后的mark = " + buf.mark());

        buf.flip();//put写之后要flip,将position置为0,将limit置为写入的最后一个元素(待操作的下一个元素)所在的索引位置
        System.out.println("flip之后的position = " + buf.position());
        System.out.println("flip之后的limit = " + buf.limit());
        System.out.println("flip之后的mark = " + buf.mark());

        /*
        while(buf.hasRemaining()){
            System.out.println("#" + (char)buf.get());
        }
        System.out.println("get之后的position = " + buf.position());
        System.out.println("get之后的limit = " + buf.limit());
        System.out.println("get之后的mark = " + buf.mark());
        */

        for(int i = 0 ; i <= 3; i++ ){
            System.out.println("#" + (char)buf.get());
        }
        System.out.println("部分get读之后的position = " + buf.position());

        buf.compact();
        System.out.println("compact之后的position = " + buf.position());
        System.out.println("compact之后的limit = " + buf.limit());
        System.out.println("compact之后的mark = " + buf.mark());

        buf.put("abcd".getBytes());
        buf.flip();
        while(buf.hasRemaining()){
            System.out.println("#" + (char)buf.get());
        }

        buf.clear();
        System.out.println("clear之后的position = " + buf.position());
        System.out.println("clear之后的limit = " + buf.limit());
        System.out.println("clear之后的mark = " + buf.mark());
    }
}
目录
相关文章
|
存储 编解码 移动开发
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
228 1
andeoid 开发:Error:java.lang.OutOfMemoryError: GC overhead limit exceeded
andeoid 开发:Error:java.lang.OutOfMemoryError: GC overhead limit exceeded
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
283 1
idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
idea启动java服务报错OutOfMemoryError: GC overhead limit exceeded解决方法
8407 3
|
监控 Java
【Java】已解决:Java.lang.OutOfMemoryError: GC overhead limit exceeded
【Java】已解决:Java.lang.OutOfMemoryError: GC overhead limit exceeded
5906 0
java中Stream流中的forEach、filter、map、count、limit、skip、concat
java中Stream流中的forEach、filter、map、count、limit、skip、concat
636 0
|
Java 编译器 iOS开发
8 种 Java 内存溢出之七 -Requested array size exceeds VM limit
8 种 Java 内存溢出之七 -Requested array size exceeds VM limit
|
Java 开发者 iOS开发
8 种 Java- 内存溢出之二 -GC overhead limit exceeded
8 种 Java- 内存溢出之二 -GC overhead limit exceeded
|
Java
JAVA方法的定义
JAVA方法的定义
295 0
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
318 25