code: protected void seek(long byteCount, SeekMode mode) {
  
      if (this.seekMode == null) {
        this.seekMode = mode;
      } else if (this.seekMode != mode) {
        // TODO: add dedicated exception or constructor to
        // IllegalStateException...
        throw new NlsIllegalArgumentException("remove and skip can NOT be mixed!");
      }
      this.seekCount = this.seekCount + byteCount;
      if (this.currentArray != null) {
        // if removeCount was > 0 before, then currentArray had been null.
        if (mode == SeekMode.REMOVE) {
          if (this.currentArrayMin < this.currentArrayIndex) {
            // there are bytes that have been consumed before remove was
            // invoked...
            ByteArray subArray = this.currentByteArray.createSubArray(this.currentArrayMin,
                this.currentArrayIndex - 1);
            this.chainSuccessor.append(subArray);
            this.currentArrayMin = this.currentArrayIndex;
          }
        }
        long currentBytesAvailable = this.currentArrayMax - this.currentArrayIndex + 1;
        if (currentBytesAvailable > this.seekCount) {
          this.currentArrayIndex = (int) (this.currentArrayIndex + this.seekCount);
          this.seekCount = 0;
          this.seekMode = null;
          if (mode == SeekMode.REMOVE) {
            this.currentArrayMin = this.currentArrayIndex;
          }
        } else {
          this.seekCount = this.seekCount - currentBytesAvailable;
          nextArray();
          if (this.seekCount == 0) {
            this.seekMode = null;
          }
        }
      }
    }
docs: This method {@link #remove(long) removes} or {@link #skip(long) skips} the given number of bytes.
  
  @param byteCount is the number of bytes to seek.
  @param mode is the {@link SeekMode}.