Java Nio Buffer 一

2017/05/14 Java

Java Nio Buffer 一

Buffer

上图一张,Buffer类的家谱关系

图一

顶层的Buffer类定义了所有buffer类共有的操作和属性。共有的属性如下:

  • 容量(Capacity)
  • 上届(limit)
  • 位置(Position)
  • 标记(Mark)

顶级类的类前面如下:

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类中不少方法支持级联调用。这篇文章主要说一下Buffer的共性。

Buffer 翻转

写满了缓冲区,现在我们必须准备将其清空。我们想把这个缓冲区传递给一个通道,以使内容能被全部写出。但如果通道现在在缓冲区上执行 get(),那么它将从我们刚刚 插入的有用数据之外取出未定义数据。如果我们将位置值重新设为 0,通道就会从正确位置开始获取,这就是上界属性被引入的目 的。上界属性指明了缓冲区有效内容的末端。我们需要将上界属性设置为当前位置,然后将位置重置为 0。我们可以人工用下面的代码实现:

buffer.limit(buffer.position()).position(0); 或者直接使用 Buffer.flip();

Flip()函数将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素的释放状态。

Buffer 标记

标记,使缓冲区能够记住一个位置并在之后将其返回。缓冲区的标记在 mark( ) 函数被调用之前是未定义的,调用时标记被设为当前位置的值。reset( )函数将位置设为当前的标记值。如果标记值未定义,调用 reset( )将导致 InvalidMarkException 异常。一些缓冲区函数会抛弃已经设定的标记 (rewind( )clear( ),以及 flip( )总是抛弃标记)。如果新设定的值比当前的标记小,调用 limit( )position( )带有索引参数的版本会抛弃标记。

Show Disqus Comments

Search

    Table of Contents