JAVA NIO BUFFER (二)

Buffer管理着给定数目的数据元素。但是在大多数情况下,我们只关心其中的一部分数据。就像是,当我们想要向池子里倒水时,水盆里的水,只盛了一半。但我们需要追踪一些信息,buffer中已经有的数据,下一个处理哪个数据?position属性负责处理这个信息。当处理put(向buffer中写入数据)或者get方法(从buffer中获取数据)的时候,position就会更新。

尽管在JAVA NIO BUFFER(一)中,列表中没有put和get方法。但是每个Buffer都包含这两个方法,因为每个buffer的实现不同,需要处理不同的数据类型,没法被声明为抽象方法(nio在jdk1.4被引入,泛型是1.5)。我们用ByteBuffer作为例子,来看这两个方法的声明

public abstract class ByteBuffer extends Buffer implements Comparable {
  //列出了一部分api
  public abstract byte get();
  public abstract byte get(int index);
  public abstract ByteBuffer put(byte b);
  public abstract ByteBuffer put(int index, byte b);
}

如果不指定具体的位置,put和get就会操作在现有的position属性上,并将position加1。如果超出了capacity。如果是读操作就会抛出BufferOverflowException,写操作就会BufferUnderflowException.如果是任意操作,也会抛出一个IndexOutOfBoundsException.

让我们试着对ByteBuffer中写入数据,如果执行下面的命令,JAVA NIO BUFFER(一)中的概念图,就会变成如下的样子。

 buffer.put((byte)'H').put((byte)'e').put((byte)'l').put((byte)'l').put((byte)'o');
JAVA NIO BUFFER (二)_第1张图片
B2CE351E19F8ECB67C2AD0AEE197EE5B.jpg

猜一猜,如果执行这个命令

  buffer.put(0,(byte)'M').put((byte)'w');

会变成什么样子?

JAVA NIO BUFFER (二)_第2张图片
1D7142D68BB086C4A65AD87549C30598.jpg

会变成这样!,第一个把0位置的H替换为M,然后紧接着的put操作查看到了position在5位置,把5位置写入W,然后position自加变为6.

你可能感兴趣的:(JAVA NIO BUFFER (二))