Java NIO Buffer(一)Buffer概述

举报
张俭 发表于 2023/12/29 14:57:47 2023/12/29
【摘要】 Buffer即缓冲区,是包含有一定量数据的容器。Buffer的工作和Channel有着紧密的联系。Channel是I/O的出入口,buffer就是IO的来源或者目标。要向外传输数据,把数据存放在buffer中交给channel要接受数据,提供buffer让channel写入。BufferCharBufferIntBufferDoubleBufferShortBufferLongBufferF...

Buffer即缓冲区,是包含有一定量数据的容器。Buffer的工作和Channel有着紧密的联系。Channel是I/O的出入口,buffer就是IO的来源或者目标。
要向外传输数据,把数据存放在buffer中交给channel
要接受数据,提供buffer让channel写入。

BufferCharBufferIntBufferDoubleBufferShortBufferLongBufferFloatBufferByteBufferMappedBufferextends

Capacity
Buffer可以包含的最大字节数。当Buffer创建的时候,容量被设置而且不可更改

Limit
Buffer中的第一个元素,这个元素不应该被读或者是被写。包含着在buffer中“存活”的数据个数

Position
下一个被操作的数据的位置。put和get操作会更新position的位置

Mark
一个有记忆的位置,设置了mark,之后可以回退到标记点,重新进行操作。

新创建一个大小为10的Buffer,概念中可以理解成是这样的

image.png

下面是Buffer的方法签名

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();
}

你可能会觉得有一些方法应该返回空值,但是却返回了buffer对象,这是为了构建一个流式的API。比如像这样的代码

 buffer.mark();
 buffer.position(5);
 buffer.reset()
 //就可以写成下面这样
 buffer.mark().position(5).reset();

所有的buffer都是可读的,但并不是所有的buffer都支持写操作,通过isReadOnly方法判断是否可以写,如果你试图向不支持写操作的buffer中写入数据,会抛出ReadOnlyBufferException异常。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。