docs: @Override
    public InputStream asInputStream() {
      return new InputStream() {
        @Override
        public int available() {
          return AbstractIoBuffer.this.remaining();
        }
  
        @Override
        public synchronized void mark(int readlimit) {
          AbstractIoBuffer.this.mark();
        }
  
        @Override
        public boolean markSupported() {
          return true;
        }
  
        @Override
        public int read() {
          if (AbstractIoBuffer.this.hasRemaining()) {
            return AbstractIoBuffer.this.get() & 0xff;
          } else {
            return -1;
          }
        }
  
        @Override
        public int read(byte[] b, int off, int len) {
          int remaining = AbstractIoBuffer.this.remaining();
          if (remaining > 0) {
            int readBytes = Math.min(remaining, len);
            AbstractIoBuffer.this.get(b, off, readBytes);
            return readBytes;
          } else {
            return -1;
          }
        }
  
        @Override
        public synchronized void reset() {
          AbstractIoBuffer.this.reset();
        }
  
        @Override
        public long skip(long n) {
          int bytes;
          if (n > Integer.MAX_VALUE) {
            bytes = AbstractIoBuffer.this.remaining();
          } else {
            bytes = Math.min(AbstractIoBuffer.this.remaining(), (int) n);
          }
          AbstractIoBuffer.this.skip(bytes);
          return bytes;
        }
      };
    }