Java - Buffer Position, Limit and Mark

Introduction

Position and limit are two properties of a buffer.

When a buffer is created, its position is set to 0 and its limit is equal to its capacity.

You can get/set the position of a buffer using its position() method.

Method Meaning
position() returns the current value of the position of a buffer.
position(int newPosition) sets the position of the buffer to the specified newPosition value and returns the reference of the buffer.

You can get/set the limit of a buffer using its overloaded limit() method.

Method Meaning
limit()returns the current value of the limit of a buffer.
limit(int newLimit) sets the limit of a buffer to the specified newLimit value and returns the reference of the buffer.

You can bookmark a position of a buffer by using the mark() method.

When you call the mark() method, the buffer stores the current value of its position as its mark value.

Then set the position of a buffer to its previously bookmarked value by reset() method.

The buffer's mark is not defined when it is created.

You must call the reset() method on a buffer only when its mark is defined. Otherwise, the reset() method throws an InvalidMarkException.

The following formula must hold during the lifetime of a buffer:

0 <= mark <= position <= limit <= capacity

The following code shows Mark, Position, Limit, and Capacity of a New Buffer

Demo

import java.nio.ByteBuffer;
import java.nio.InvalidMarkException;

public class Main {
  public static void main(String[] args) {
    // Create a byte buffer of capacity 8
    ByteBuffer bb = ByteBuffer.allocate(8);

    System.out.println("Capacity: " + bb.capacity());
    System.out.println("Limit: " + bb.limit());
    System.out.println("Position: " + bb.position());

    // The mark is not set for a new buffer. Calling the
    // reset() method throws a runtime exception if the mark is not set.
    // If the mark is set, the position is set to the mark value.
    try {//from  w w w . j  a  va 2s .c  om
      bb.reset();
      System.out.println("Mark: " + bb.position());
    } catch (InvalidMarkException e) {
      System.out.println("Mark is not set");
    }
  }
}

Result