@Override
 public int directRead(byte[] b, int off, int len) throws IOException {
   ByteBuffer buf = mLocalFileChannel.map(FileChannel.MapMode.READ_ONLY, getPosition(), len);
   buf.get(b, off, len);
   BufferUtils.cleanDirectBuffer(buf);
   return len;
 }
 @Override
 protected void bufferedRead(int len) throws IOException {
   if (mBuffer.isDirect()) { // Buffer may not be direct on initialization
     BufferUtils.cleanDirectBuffer(mBuffer);
   }
   mBuffer = mLocalFileChannel.map(FileChannel.MapMode.READ_ONLY, getPosition(), len);
 }
  @Override
  public void close() throws IOException {
    if (mClosed) {
      return;
    }
    try {
      if (mBlockIsRead) {
        mWorkerClient.accessBlock(mBlockId);
        ClientContext.getClientMetrics().incBlocksReadLocal(1);
      }
      mWorkerClient.unlockBlock(mBlockId);
    } catch (TachyonException e) {
      throw new IOException(e);
    } finally {
      mContext.releaseWorkerClient(mWorkerClient);
      mCloser.close();
      if (mBuffer != null && mBuffer.isDirect()) {
        BufferUtils.cleanDirectBuffer(mBuffer);
      }
    }

    mClosed = true;
  }