让星星⭐月亮告诉你,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());
    }
}
目录
相关文章
|
1天前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
1天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
7 1
|
1天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
3 1
|
1天前
|
Java 调度 UED
深入理解Java中的多线程与并发机制
本文将详细探讨Java中多线程的概念、实现方式及并发机制,包括线程的生命周期、同步与锁机制以及高级并发工具。通过实例代码演示,帮助读者理解如何在Java中有效地处理多线程和并发问题,提高程序的性能和响应能力。
|
7天前
|
监控 Java Linux
Java 性能调优:调整 GC 线程以获得最佳结果
Java 性能调优:调整 GC 线程以获得最佳结果
39 11
|
1天前
|
Java
|
1天前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
6 1
|
3天前
|
并行计算 Java 调度
深入理解Java中的多线程编程
【10月更文挑战第6天】 本文将探讨Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。通过详细的示例和解释,读者能够掌握如何在Java中有效地使用多线程来提高程序的性能和响应能力。
8 1
|
4天前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
12 2
|
5天前
|
监控 Java 调度
Java有哪几种方式创建线程?
本文详细介绍了Java中创建线程的四种主要方法:继承`Thread`类、实现`Runnable`接口、实现`Callable`接口配合`Future`,以及使用`Executor`框架。每种方法都有其独特特性和适用场景。通过示例代码和特点分析,帮助开发者根据具体需求选择合适的方式。
14 3