iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java之Buffer属性怎么用
  • 434
分享到

Java之Buffer属性怎么用

2023-06-20 20:06:17 434人浏览 安东尼
摘要

这篇文章给大家分享的是有关Java之Buffer属性怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性

这篇文章给大家分享的是有关Java之Buffer属性怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、前言

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

二、正文

1、介绍

  • position: 它指的是下一次读取或写入的位置。

  • limit: 指定还有多少数据需要写出(在从缓冲区写入通道时),或者还有多少空间可以读入数据(在从通道读入缓冲区时),它初始化是与capacity的值一样,当调用flip()方法之后,它的值会改变成position的值,而position被置0。它箭头所指的位置是最后一位元素的下一位所在的位置*

  • capacity: 指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量,这个初始化后就不会再改变了。

2、图示

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

初始化:

Java之Buffer属性怎么用

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

Java之Buffer属性怎么用

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

Java之Buffer属性怎么用

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

Java之Buffer属性怎么用

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

Java之Buffer属性怎么用

之前学到这里的时候有个疑问,不知道大家想过没有,就是我们在调用了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()的方法      positon:0    limit:3       capacity:7

  • 当你读取2个字节之后调用flip()方法       positon:0    limit:2       capacity:7

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

三、测试代码

读取完调用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],

感谢各位的阅读!关于“Java之Buffer属性怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java之Buffer属性怎么用

本文链接: https://www.lsjlt.com/news/299993.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java之Buffer属性怎么用
    这篇文章给大家分享的是有关Java之Buffer属性怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性...
    99+
    2023-06-20
  • Java之Buffer属性案例详解
    一、前言 熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性吧,之前在学习的时候遇到一个问题:就是当你先往缓冲区写入一部分数据,然后...
    99+
    2024-04-02
  • Position属性之relative怎么使用
    position:relative属性用于指定元素的定位方式为相对定位。相对定位是相对于元素在正常文档流中的位置进行定位,元素仍然占据原来的空间。要使用position:relative属性,需要按照以下步骤进行操作:1. 在CSS样式...
    99+
    2023-08-09
    Position relative
  • CSS定位属性之固定fixed属性怎么使用
    本篇内容介绍了“CSS定位属性之固定fixed属性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C...
    99+
    2024-04-02
  • React三大属性之props怎么用
    这篇文章主要介绍React三大属性之props怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!props功能在于组件间通信(父子组件),首先说说在各种组件中的用法:类组件//父组件传值class Fat...
    99+
    2023-06-14
  • CSS定位属性之相对定位relative属性怎么使用
    这篇“CSS定位属性之相对定位relative属性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一...
    99+
    2024-04-02
  • Innodb关键特性之什么是Insert Buffer
    本篇内容介绍了“Innodb关键特性之什么是Insert Buffer”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够...
    99+
    2024-04-02
  • java怎么根据属性名获取属性值
    在 Java 中,可以使用反射来根据属性名获取属性值。下面是一个示例代码:```javaimport java.lang.refle...
    99+
    2023-08-16
    java
  • innodb新特性之怎么使用buffer pool动态调整大小
    这篇文章主要介绍“innodb新特性之怎么使用buffer pool动态调整大小”,在日常操作中,相信很多人在innodb新特性之怎么使用buffer pool动态调整大小问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • Java学习之类的属性(转)
    Java学习之类的属性(转)[@more@] Public、private、protected显示了三种类中的属性和服务的类型,public是可以随意访问的、private是外界不能访问的(显示了数据的封装性)、protected说明数据是...
    99+
    2023-06-03
  • 怎么使用java反射获取属性
    要使用Java反射获取属性,可以按照以下步骤进行:1. 获取要操作的类的Class对象:```javaClass clazz = Y...
    99+
    2023-09-04
    java
  • Position属性之relative用法
    Position属性的relative值表示元素的位置相对于其正常位置进行偏移。它会根据元素的原始位置在文档流中进行相对的移动,但不会影响其他元素的布局。相对定位的元素会保留其原始的空间占用,也就是说,其他元素不会填充相对定位元素的空间...
    99+
    2023-08-09
    Position
  • css3动画属性中Transitions属性与Animations属性怎么用
    小编给大家分享一下css3动画属性中Transitions属性与Animations属性怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!   1Transitions功能   (1...
    99+
    2024-04-02
  • java怎么获取bean中属性
    在Java中,可以使用反射来获取一个对象中的属性。具体步骤如下:1. 使用`Class.forName("类的全限定名")`方法获取...
    99+
    2023-09-20
    java
  • java反射怎么调用指定的属性
    这篇文章主要介绍了java反射怎么调用指定的属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明在反射机制中,可以直接通过Field类操作类中的属性,通过Field类提...
    99+
    2023-06-15
  • 怎么用java反射给属性加注解
    在Java中,无法直接使用反射给属性添加注解。注解只能在编译期间被处理,而反射是在运行时动态获取和操作类的信息。因此,无法通过反射来...
    99+
    2023-10-22
    java
  • css之display属性的作用是什么
    display属性用于设置元素的显示方式。常用的display属性值及其作用如下:- none:元素不显示,其在页面中占据的空间也会...
    99+
    2023-09-21
    css
  • css中怎么使用border属性与display属性
    这篇文章主要介绍css中怎么使用border属性与display属性,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! css中如何使用border属性与display属性 bord...
    99+
    2024-04-02
  • Css字体属性和文本属性怎么用
    这篇文章主要为大家展示了“Css字体属性和文本属性怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Css字体属性和文本属性怎么用”这篇文章吧。字体属性:主要...
    99+
    2024-04-02
  • boost.asio框架系列之buffer函数怎么使用
    本文小编为大家详细介绍“boost.asio框架系列之buffer函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“boost.asio框架系列之buffer函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作