@Override public void write(byte[] b, int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException( String.format("Buffer length (%d), offset(%d), len(%d)", b.length, off, len)); } if (!mCanWrite) { throw new IOException("Can not write cache."); } if (mWrittenBytes + len > BLOCK_CAPACITY_BYTE) { throw new IOException("Out of capacity."); } if (mBuffer.position() + len >= USER_CONF.FILE_BUFFER_BYTES) { if (mBuffer.position() > 0) { appendCurrentBuffer(mBuffer.array(), 0, mBuffer.position()); mBuffer.clear(); } if (len > 0) { appendCurrentBuffer(b, off, len); } } else { mBuffer.put(b, off, len); } mWrittenBytes += len; }
@Override public void write(int b) throws IOException { if (!mCanWrite) { throw new IOException("Can not write cache."); } if (mWrittenBytes + 1 > BLOCK_CAPACITY_BYTE) { throw new IOException("Out of capacity."); } if (mBuffer.position() >= USER_CONF.FILE_BUFFER_BYTES) { appendCurrentBuffer(mBuffer.array(), 0, mBuffer.position()); mBuffer.clear(); } mBuffer.put((byte) (b & 0xFF)); mWrittenBytes++; }
@Override public void close() throws IOException { if (!mClosed) { if (!mCancel && mBuffer.position() > 0) { appendCurrentBuffer(mBuffer.array(), 0, mBuffer.position()); } if (mLocalFileChannel != null) { mLocalFileChannel.close(); mLocalFile.close(); } if (mCancel) { TFS.releaseSpace(mWrittenBytes - mBuffer.position()); new File(mLocalFilePath).delete(); LOG.info("Canceled output of block " + BLOCK_ID + ", deleted local file " + mLocalFilePath); } else { TFS.cacheBlock(BLOCK_ID); } } mClosed = true; }