关于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 ...
我们看到除了打印出数组中我们设置的内容之外,还会在后面打印出一系列自动设置的零值。
相关推荐
总的来说,ByteBuffer是Android开发中处理二进制数据的强大工具,熟练掌握其用法和优化策略,可以显著提高应用程序的性能。在处理大量数据交换、网络通信和图像处理等场景时,合理使用ByteBuffer至关重要。
本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...
Buffer的API还包括clear、flip、rewind等方法,用于在读写模式之间切换和管理缓冲区状态。 2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个...
【Android开发问题集锦第一期】包含了多个关于Android开发中常见问题的解答,这些问题涵盖了图像处理、内存管理、Java特性的支持以及系统组件的使用等多个方面。以下是对这些问题的详细解释: 1. **Bitmap如何保存...
下面详细说明Java NIO中的主要类和方法。 Buffer类(C.1.1): Buffer类是一个抽象类,提供了缓冲区操作的基本结构。以下是一些核心方法的简要说明: - capacity(): 返回此缓冲区的容量。 - clear(): 清除此缓冲区,...
综上所述,《倾城服务器源码解读(一)》中的ByteBuffer部分主要围绕其基本概念、操作方法、内存管理以及在高性能网络编程中的应用展开,帮助读者深入理解这一关键工具的使用和优化技巧。在后续篇章中,可能还会涉及...
可以通过在主Activity的onBackPressed()方法中调用`finishAffinity()`来关闭所有关联的Activity,再结合`System.exit(0)`强制退出应用,但这种方法并不推荐,因为它可能导致数据丢失和用户体验不佳。 问题七:View...
`ByteBuffer`中有几个重要的方法:`flip()`, `clear()` 和 `rewind()`,它们分别控制着`ByteBuffer`的读写状态。 **方法区别**: 1. **clear()**:清除`ByteBuffer`的状态,即将位置(position)重置为0,并且极限...
在 Netty 中,ByteBuf 是一个高效且灵活的字节缓冲区,它解决了 Java NIO 中 ByteBuffer 的一些限制和不便。 首先,让我们深入理解 ByteBuffer 的局限性: 1. 固定长度:ByteBuffer 在创建时分配了固定的容量,一旦...
Java8 中的 NIO 缓冲区(Buffer)提供了多种类型的缓冲区,包括 ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer 等,每种类型的缓冲区都有其特定的用途和使用方法。...
- 通过`rewind`方法重置`ByteBuffer`的指针位置,以便于读取数据。 - 将`ByteBuffer`中的数据转换为字符串,逐行处理。 - 对于每一行数据,调用`writeFileByLine`方法进行处理。 3. **逐行写入文件** 这部分...
Java提供了多种类型的缓冲区,包括`ByteBuffer`、`ShortBuffer`、`IntBuffer`、`CharBuffer`、`FloatBuffer`、`DoubleBuffer`和`LongBuffer`。这些缓冲区由各自的类管理,并且都在`java.nio`包中定义。 1. **通过`...
Java NIO中提供了多种类型的缓冲区,如ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer、MappedByteBuffer等,每种类型的缓冲区都有其特定的用途和应用场景。 通道...
此外,还可以通过`flip()`、`rewind()`和`compact()`等方法控制缓冲区的状态,使其能够在读写之间切换。 4. **字符串处理**:对于字符串的处理,可以利用`CharsetEncoder`和`CharsetDecoder`类进行编码和解码。例如...
其中,`get()`和`put()`方法是最常用的两个方法。 - `get()`方法用于从Buffer中读取数据。它有不同的重载版本,可以读取单个字节、数组或指定范围内的数据。 - `put()`方法则用于向Buffer中写入数据。同样,它也...
接着,我们分配了一个 `ByteBuffer` 并使用 `read()` 和 `write()` 方法来完成文件的复制操作。 通过上述介绍和示例,我们可以看出 Java NIO 在提高 I/O 性能方面具有显著优势,尤其是在处理大量数据时更为明显。...
由于对于本程序 116个字节以上的行才有意义,所以 在next实现方法中,有对 116 长度的判断,否则返回 null 修正了之前版本中的问题: 修正后的方法 private int readByte() throws IOException{ fbb.rewind(); ...