@Override
 public int write(ByteBuffer src) throws IOException {
   int len = src.remaining();
   if (len == 0) {
     return 0;
   }
   data.touch(readOnly);
   pos = data.readWrite(pos, src, 0 /*because we start writing from src.position()*/, len, true);
   src.position(src.position() + len);
   return len;
 }
 @Override
 public int read(ByteBuffer dst) throws IOException {
   int len = dst.remaining();
   if (len == 0) {
     return 0;
   }
   long newPos = data.readWrite(pos, dst, dst.position(), len, false);
   len = (int) (newPos - pos);
   if (len <= 0) {
     return -1;
   }
   dst.position(dst.position() + len);
   pos = newPos;
   return len;
 }