`

关于ByteBuffer中flip和rewind方法的作用说明

阅读更多

        关于flip,看到JDK的文档大概是这么说的:“将limit属性设置为当前的位置”;而关于rewind方法,是在limit属性已经被设置合适的情况下使用的。也就是说这两个方法虽然都能够使指针返回到缓冲区的第一个位置,但是flip在调整指针之前,将limit属性设置为当前位置。

        以下程序可以验证:

package com.bijian.study;

import java.nio.*;

public class IntBufferDemo {

    /**
    * @param args
    */
    private static final int BSIZE = 1024;

    public static void main(String[] args) {

        ByteBuffer bb = ByteBuffer.allocate(BSIZE);
        IntBuffer ib = bb.asIntBuffer(); // view buffer

        // 存储int的数组
        ib.put(new int[] { 11, 42, 47, 99, 143, 811, 1016 });

        // 绝对位置读写
        //System.out.println(ib.get(3));

        System.out.println("*******************************");
        System.out.println(ib.limit());
        ib.put(3, 1811);
        ib.flip();
        //ib.rewind();
        System.out.println(ib.limit());
        System.out.println("*******************************");
        
        while (ib.hasRemaining()) {
            int i = ib.get();
            System.out.println(i);
        }
    }
}

运行结果:

*******************************
256
7
*******************************
11
42
47
1811
143
811
1016

        将flip()替换成rewind()如下:

package com.bijian.study;

import java.nio.*;

public class IntBufferDemo {

    /**
    * @param args
    */
    private static final int BSIZE = 1024;

    public static void main(String[] args) {

        ByteBuffer bb = ByteBuffer.allocate(BSIZE);
        IntBuffer ib = bb.asIntBuffer(); // view buffer

        // 存储int的数组
        ib.put(new int[] { 11, 42, 47, 99, 143, 811, 1016 });

        // 绝对位置读写
        //System.out.println(ib.get(3));

        System.out.println("*******************************");
        System.out.println(ib.limit());
        ib.put(3, 1811);
        //ib.flip();
        ib.rewind();
        System.out.println(ib.limit());
        System.out.println("*******************************");
        
        while (ib.hasRemaining()) {
            int i = ib.get();
            System.out.println(i);
        }
    }
}

运行结果:

*******************************
256
256
*******************************
11
42
47
1811
143
811
1016
0
0
0
0
0
...

        我们看到除了打印出数组中我们设置的内容之外,还会在后面打印出一系列自动设置的零值。

 

文章来源:http://blog.csdn.net/cnweike/article/details/6942024

分享到:
评论

相关推荐

    Android中的ByteBuffer解析

    总的来说,ByteBuffer是Android开发中处理二进制数据的强大工具,熟练掌握其用法和优化策略,可以显著提高应用程序的性能。在处理大量数据交换、网络通信和图像处理等场景时,合理使用ByteBuffer至关重要。

    Java NIO学习笔记——ByteBuffer用法

    本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...

    java.nio API详解

    Buffer的API还包括clear、flip、rewind等方法,用于在读写模式之间切换和管理缓冲区状态。 2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个...

    Android开发问题集锦第一期.pdf

    【Android开发问题集锦第一期】包含了多个关于Android开发中常见问题的解答,这些问题涵盖了图像处理、内存管理、Java特性的支持以及系统组件的使用等多个方面。以下是对这些问题的详细解释: 1. **Bitmap如何保存...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    下面详细说明Java NIO中的主要类和方法。 Buffer类(C.1.1): Buffer类是一个抽象类,提供了缓冲区操作的基本结构。以下是一些核心方法的简要说明: - capacity(): 返回此缓冲区的容量。 - clear(): 清除此缓冲区,...

    倾城服务器源码解读(一)

    综上所述,《倾城服务器源码解读(一)》中的ByteBuffer部分主要围绕其基本概念、操作方法、内存管理以及在高性能网络编程中的应用展开,帮助读者深入理解这一关键工具的使用和优化技巧。在后续篇章中,可能还会涉及...

    Android开发问题集锦第一期[归纳].pdf

    可以通过在主Activity的onBackPressed()方法中调用`finishAffinity()`来关闭所有关联的Activity,再结合`System.exit(0)`强制退出应用,但这种方法并不推荐,因为它可能导致数据丢失和用户体验不佳。 问题七:View...

    Android开发问题集锦第一期

    `ByteBuffer`中有几个重要的方法:`flip()`, `clear()` 和 `rewind()`,它们分别控制着`ByteBuffer`的读写状态。 **方法区别**: 1. **clear()**:清除`ByteBuffer`的状态,即将位置(position)重置为0,并且极限...

    netty相关源码1

    在 Netty 中,ByteBuf 是一个高效且灵活的字节缓冲区,它解决了 Java NIO 中 ByteBuffer 的一些限制和不便。 首先,让我们深入理解 ByteBuffer 的局限性: 1. 固定长度:ByteBuffer 在创建时分配了固定的容量,一旦...

    java8中NIO缓冲区(Buffer)的数据存储详解

    Java8 中的 NIO 缓冲区(Buffer)提供了多种类型的缓冲区,包括 ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer 等,每种类型的缓冲区都有其特定的用途和使用方法。...

    java读取大文件大全

    - 通过`rewind`方法重置`ByteBuffer`的指针位置,以便于读取数据。 - 将`ByteBuffer`中的数据转换为字符串,逐行处理。 - 对于每一行数据,调用`writeFileByLine`方法进行处理。 3. **逐行写入文件** 这部分...

    Java中的缓冲区(直接缓冲区、非直接缓冲区等).docx

    Java提供了多种类型的缓冲区,包括`ByteBuffer`、`ShortBuffer`、`IntBuffer`、`CharBuffer`、`FloatBuffer`、`DoubleBuffer`和`LongBuffer`。这些缓冲区由各自的类管理,并且都在`java.nio`包中定义。 1. **通过`...

    JavaNIO.pdf

    Java NIO中提供了多种类型的缓冲区,如ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer、MappedByteBuffer等,每种类型的缓冲区都有其特定的用途和应用场景。 通道...

    android开发进阶之NIO非阻塞包

    此外,还可以通过`flip()`、`rewind()`和`compact()`等方法控制缓冲区的状态,使其能够在读写之间切换。 4. **字符串处理**:对于字符串的处理,可以利用`CharsetEncoder`和`CharsetDecoder`类进行编码和解码。例如...

    NIO详细介绍channle,buffer,Selector

    其中,`get()`和`put()`方法是最常用的两个方法。 - `get()`方法用于从Buffer中读取数据。它有不同的重载版本,可以读取单个字节、数组或指定范围内的数据。 - `put()`方法则用于向Buffer中写入数据。同样,它也...

    java NIO原理和使用

    接着,我们分配了一个 `ByteBuffer` 并使用 `read()` 和 `write()` 方法来完成文件的复制操作。 通过上述介绍和示例,我们可以看出 Java NIO 在提高 I/O 性能方面具有显著优势,尤其是在处理大量数据时更为明显。...

    JAVA NIO 按行读取大文件支持 GB级别-修正版

    由于对于本程序 116个字节以上的行才有意义,所以 在next实现方法中,有对 116 长度的判断,否则返回 null 修正了之前版本中的问题: 修正后的方法 private int readByte() throws IOException{ fbb.rewind(); ...

Global site tag (gtag.js) - Google Analytics