文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java之Buffer属性案例详解

2024-04-02 19:55

关注

一、前言

熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性吧,之前在学习的时候遇到一个问题:就是当你先往缓冲区写入一部分数据,然后调用flip()方法,再全部读取完数据,然后再调用flip()方法,此时这三个值的变化是怎样的,研究了一下,决定写下来分享一下。

二、正文

1、介绍

2、图示

以上三个属性值之间有一些相对大小的关系:0 <= position <= limit <= capacity。如果我们创建一个新的容量大小为7的ByteBuffer对象,在初始化的时候,position设置为0,limit和 capacity被设置为7,在以后使用ByteBuffer对象过程中,capacity的值不会再发生变化,而其它两个个将会随着使用而变化。三个属性值分别如图所示:

初始化:

假设我们现在要往这个缓冲区里面写入3个字节,写完之后,position的箭头就会指向3的位置,而limit不变:

此时我们想从缓冲区读取这3个字节,就必须调用flip()方法,调用了flip()方法过后,limit置为position的位置,而position被置为0,也正应证了上面所说的,position它指的是下一次读取或写入的位置,limit它箭头所指的位置是最后一位元素的下一位所在的位置:

现在我们可以调用get()方法,一直从缓冲区里面取数据,直到取完为止,也就是当position与limit的值一样时,就取完了:

这一次简单的读写操作就完成了,如果想恢复成初始状态的话,可以调用clear()方法:

之前学到这里的时候有个疑问,不知道大家想过没有,就是我们在调用了get()方法从缓冲区取完里面的数据,立马去调用flip()方法,那这三个属性的值会是什么变化?如果当我只读了2个字节的数据之后,就不读了,然后再去调用flip(),这三个值又会是怎么变化?其实不管怎么绕,你只要懂得原理,就不难,咱们先看flip()源代码做了什么:


    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

这里不难发现,调用flip()方法,无非就是给这几个变量赋值,将当前的position值赋给limit,然后将position的值置为0,Mark是一个标志变量,咱们以后会提到。熟悉以上代码就不难解决我提出的2个问题:

这里就解决了我之前遇到的这三个属性值变化的问题!!!

三、测试代码

读取完调用flip:


package com.cing.nio;
 
import java.io.FileInputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
 
public class NioTest1 {
    public static void main(String[] args) throws Exception{
 
        FileInputStream fis = new FileInputStream("D:\\A.txt");
        FileChannel fc = fis.getChannel();
 
        ByteBuffer buffer = ByteBuffer.allocate(7);
        output("初始化", buffer);
 
        fc.read(buffer);
        output("调用READ方法", buffer);
 
        buffer.flip();
        output("第一次调用flip", buffer);
 
        while (buffer.remaining() > 0) {
            byte b = buffer.get();
        }
        output("get()", buffer);
 
        buffer.flip();
        output("第二次flip", buffer);
 
        fis.close();
    }
 
    public static void output(String step, Buffer buffer) {
        System.out.println(step + " : ");
        System.out.println("buffer: " + buffer + ", ");
    }
}
 
 

输出结果为:


初始化 : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=7 cap=7], 
调用READ方法 : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=7 cap=7], 
第一次调用flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=3 cap=7], 
get() : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=3 cap=7], 
第二次flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=3 cap=7], 

读取2字节之后调用flip:


package com.cing.nio;
 
import java.io.FileInputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
 
public class NioTest1 {
    public static void main(String[] args) throws Exception{
 
        FileInputStream fis = new FileInputStream("D:\\A.txt");
        FileChannel fc = fis.getChannel();
 
        ByteBuffer buffer = ByteBuffer.allocate(7);
        output("初始化", buffer);
 
        fc.read(buffer);
        output("调用READ方法", buffer);
 
        buffer.flip();
        output("第一次调用flip", buffer);
 
        while (buffer.remaining() > 1) {
            byte b = buffer.get();
        }
        output("get()", buffer);
 
        buffer.flip();
        output("第二次flip", buffer);
 
        fis.close();
    }
 
    public static void output(String step, Buffer buffer) {
        System.out.println(step + " : ");
        System.out.println("buffer: " + buffer + ", ");
    }
}
 

输出结果为:


初始化 : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=7 cap=7], 
调用READ方法 : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=7 cap=7], 
第一次调用flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=3 cap=7], 
get() : 
buffer: java.nio.HeapByteBuffer[pos=2 lim=3 cap=7], 
第二次flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=2 cap=7], 

NIO的知识学起来还是比较有趣的,期待下次与大家分享这块的知识!

到此这篇关于Java之Buffer属性案例详解的文章就介绍到这了,更多相关Java之Buffer属性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯