NIO之缓冲区【基础内容】,2024年最新springboot笔记系统

在这里插入图片描述

包装方式:

byte[] array = new byte[10];

ByteBuffer.wrap(array);

在这里插入图片描述

2.2 属性

所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息。

在这里插入图片描述

| 属性 | 说明 |

| — | :-- |

| 容量(Capacity) | 缓冲区能够容纳的数据元素的最大数量,缓冲区创建时被设定,永远不能被改变 |

| 上界(Limit) | 缓冲区第一个不能被读或写的元素,或者说缓冲区中现存元素的计数 |

| 位置(Position) | 下一个要被读或写的元素的索引,位置会自动由相应的get()和put()方法更新 |

| 标记(Mark) | 一个备忘位置,调用mark()方法来设定,mark=position,调用reset方法设定position=mark。标记在设定前是未定义的(undefined) |

四个属性之前总是遵循以下关系:

mark <= position <= limit <= capacity

举例:

// 创建一个ByteBuffer,容量为10

ByteBuffer byteBuffer = ByteBuffer.allocate(10);

在这里插入图片描述

位置被设为0,而且容量和上界被设为10,刚好经过缓冲区能够容纳的最后一个字节。标记最初未定义。容量是固定的,但另外的三个属性可以在使用缓冲区时改变

2.3 缓冲区API介绍

接下来我们先看下Buffer中提供的方法

package java.nio;

public abstract class Buffer {

public final int capacity( )

public final int position( )

public final Buffer position (int newPosition)

public final int limit( )

public final Buffer limit (int newLimit)

public final Buffer mark( )

public final Buffer reset( )

public final Buffer clear( )

public final Buffer flip( )

public final Buffer rewind( )

public final int remaining( )

public final boolean hasRemaining( )

public abstract boolean isReadOnly( );

}

put方法

'存取’也就将数据保存到缓冲区中及从缓冲区中取出数据,在Buffer类中并没有提供get和put方法,这两个方法在具体的Buffer子类中有提供,比如ByteBuffer.如下

public abstract class ByteBuffer

extends Buffer implements Comparable

{

// This is a partial API listing

public abstract byte get( );

public abstract byte get (int index);

public abstract ByteBuffer put (byte b);

public abstract ByteBuffer put (int index, byte b);

}

保存数据到缓冲区

public static void main(String[] args) {

// 创建一个ByteBuffer,容量为10

ByteBuffer byteBuffer = ByteBuffer.allocate(10);

// 看一下初始时4个核心变量的值

System.out.println(“初始时–>limit—>” + byteBuffer.limit());

System.out.println(“初始时–>position—>” + byteBuffer.position());

System.out.println(“初始时–>capacity—>” + byteBuffer.capacity());

System.out.println(“初始时–>mark—>” + byteBuffer.mark());

System.out.println(“--------------------------------------”);

// 添加一些数据到缓冲区中

String s = “bobo”;

byteBuffer.put(s.getBytes());

// 看一下初始时4个核心变量的值

System.out.println(“put完之后–>limit—>” + byteBuffer.limit());

System.out.println(“put完之后–>position—>” + byteBuffer.position());

System.out.println(“put完之后–>capacity—>” + byteBuffer.capacity());

System.out.println(“put完之后–>mark—>” + byteBuffer.mark());

}

输出:

初始时–>limit—>10

初始时–>position—>0

初始时–>capacity—>10

初始时–>mark—>java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]


put完之后–>limit—>10

put完之后–>position—>4

put完之后–>capacity—>10

put完之后–>mark—>java.nio.HeapByteBuffer[pos=4 lim=10 cap=10]

在这里插入图片描述

flip方法

现在我想要从缓存区拿数据,怎么拿呢?NIO给了我们一个flip()方法。这个方法可以改动position和limit的位置!

在这里插入图片描述

byteBuffer.flip();

System.out.println(“flip完之后–>limit—>” + byteBuffer.limit());

System.out.println(“flip完之后–>position—>” + byteBuffer.position());

System.out.println(“flip完之后–>capacity—>” + byteBuffer.capacity());

System.out.println(“flip完之后–>mark—>” + byteBuffer.mark());

flip完之后–>limit—>4

flip完之后–>position—>0

flip完之后–>capacity—>10

flip完之后–>mark—>java.nio.HeapByteBuffer[pos=0 lim=4 cap=10]

在这里插入图片描述

一般我们称filp()为“切换成读模式

get方法

get方法读取信息position也会对应的移动!

// 一个字节一个字节的读取

System.out.println((char)byteBuffer.get());

System.out.println((char)byteBuffer.get());

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

  • 算法与编程

  • 数据库部分

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

[外链图片转存中…(img-loWCvo1Q-1712803488000)]

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-9NnSDBqE-1712803488000)]

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值