`

我想换一种方式描述ByteBuffer中的 clear、flip、rewind三个方法区别、以及如何使用

阅读更多
我在网上搜索了很多,大部分都是说针对mark、limit、capacity、position 标志量来解释的,ok!我想补充一下,从如何应用的方面来说明其含义。

例如:
1、有一个文件共有20个字符:
    abcdefghijklmnopqrst
2、我们声明一个char[15] buffer 大小的字符数组

   for(readChar(buffer ) != -1) { //将文件的字符读入到buffer中,一次最多读15个
      println(toString(buffer))  ;//打印当前结果
   }
期望结果:abcdefghijklmnopqrst
实际输出: abcdefghijklmnopqrst[b]fghijklmnopqrst[/b]

ok 这结果显然是错误的:
    第一次buffer的结果是:
           abcdefghijklmno (15个字符)
    第二次buffer的结果是
           pqrstfghijklmno(前面5个字符是第二次读取的, 后面的10个字符是第一次读取的 )

所以接下俩我们应该改造一下代码:
       int pos;
       for((pos=readChar(buffer)) != -1) { //将文件的字符读入到buffer中,一次最多读15个
          println(toString(buffer, 0, pos))  ;//打印当前结果
       }
期望结果:abcdefghijklmnopqrst
实际输出: abcdefghijklmnopqrst

很显然这次是正确的。

ok,那我们从这个角度是思考ByteBuffer,我们同样需要ByteBuffer对象中的标志符去控制类似的情况
    ByteBuffer buffer = ByteBuffer.alloate(20);
    while(read(buffer ) > 0) { //每次写一个值,position都会加1
          //读值时,我们当然要从起始开始位置读了,所以执行,读到limit位置结束
          buffer.rewind();
          print(buffer);
          //那flip、clear,什么时候执行呢,其中clear方法,是将ByteBuffer标识重置为初始状态,ok那我们来说说flip
          我对flip的理解是 提高效率。
          首先看一下flip代码:
                 public final Buffer flip() {
	             limit = position;
	             position = 0;
	             mark = -1;
	             return this;
                  }
        仔细思考一下: 例如共有100个字节, ok!那么知道最后一次向buffer中实际读取的是10个字节,如果我在
               “print(buffer);”之后加入 buffer.flip();代码,那么最后一次buffer的中position仅加了10次。 那如果不加
        这行代码的话,会不会出现我们文章开头的错误呢? 结果是 :“会的”



ok! 以上是我对该问题的描述


分享到:
评论

相关推荐

    Android中的ByteBuffer解析

    在Android开发中,ByteBuffer是一个非常重要的工具类,它在处理二进制数据时扮演着核心角色。ByteBuffer是Java NIO(Non-Blocking I/O)的一部分,允许开发者高效地读写大量原始字节,如处理图像、音频或网络数据。...

    Java NIO学习笔记——ByteBuffer用法

    2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...

    Android开发问题集锦第一期

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

    java.nio API详解

    Java NIO(New Input/Output)API是在JDK 1.4版本中引入的一个重要的改进,它是对传统Java IO API的补充,旨在提供更高效、更灵活的数据输入和输出方式,特别是对于高并发和高性能的应用场景,如服务器端程序。...

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

    问题二:ByteBuffer的flip, clear及rewind区别 这三个方法都是用于管理Buffer的状态,以便有效地读写数据: - `clear()`方法将position重置为0,limit设置为capacity,表示缓冲区已清空,准备接受新的数据。 - `...

    NIO详细介绍channle,buffer,Selector

    **Channel**是NIO中的一个核心概念,它是一种双向的数据传输通道,可以实现数据的读取或写入。在NIO中,所有I/O操作都是通过Channel进行的。Channel的主要作用包括: 1. **提供了一种数据传输方式**:不同于传统的...

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

    Java NIO(New Input/Output)是Java提供的一种新的输入输出处理机制,它与传统IO基于流的处理方式不同,NIO支持面向缓冲区的(Buffer-oriented)、基于通道的(Channel-based)I/O操作。在Java NIO中,Buffer类是...

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

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

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

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

    java读取大文件大全

    通过上述分析可以看出,使用Java NIO来处理大文件是一种高效且灵活的方法。通过合理的代码设计和性能优化策略,可以极大地提高处理大文件的速度。希望本文能够帮助开发者更好地理解和应用Java中的大文件读取技术。

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

    下面是一个简单的示例,展示了如何使用`ByteBuffer`来读写数据: ```java import java.nio.ByteBuffer; public class BufferExample { public static void main(String[] args) { // 创建一个容量为1024字节的...

    java NIO原理和使用

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

    Java NIO入门的源码

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种I/O模型,旨在提供一种更高效、更具控制力的I/O操作方式。与传统的-blocking I/O(阻塞I/O)相比,NIO的关键在于它...

    JavaNIO.pdf

    Java NIO(Non-blocking I/O)是Java平台中的一种I/O处理方式,它提供了面向缓冲区的I/O处理机制,可以实现高性能、高效的I/O操作。 缓冲区(Buffer) 缓冲区是Java NIO中非常重要的一个概念,它是特定基本类型...

    JAVANIO简介.pdf

    在此示例中,我们首先创建了一个`ByteBuffer`,然后使用`FileChannel`从源文件读取数据并写入目标文件。`clear()`方法用于准备接收新数据,而`flip()`方法则将buffer从写模式切换到读模式,以便将数据写入目标文件。...

    Java NIO.pdf

    Buffer还有clear、flip、rewind等方法,方便数据的管理和传输。 在Java NIO中,Selector是实现多路复用的关键组件。通过注册感兴趣的Channel到Selector,我们可以等待这些Channel上的事件(如连接就绪、数据可读、...

    Java_NIO_API详解

    Channels是NIO中的另一个核心概念,它们提供了一种将数据从网络或文件传输到Buffer的方式,反之亦然。`java.nio.channels`包中定义了几种重要的通道接口及其实现,如`FileChannel`、`SocketChannel`等。 - **...

Global site tag (gtag.js) - Google Analytics