code: public synchronized long readFromEnd(final long datalen, final ByteBuffer buf) {
  		if (!validState) {
  			throw new InvalidStateException();
  		}
  		final long size = size();
  		final long offset = (size - HEADER_LEN - datalen - FOOTER_LEN);
  		return read(offset, buf);
  	}
docs: Read desired block of datalen from end of file
  
  @param datalen expected
  @param ByteBuffer
  @return new offset (offset+headerlen+datalen+footer)