public int read(byte[] b, int off, int len) throws EOFException {
        if (link.isEmpty()) {
            return 0;
        }
        int olen = len;
        while (true) {
            ByteBuffer bb = link.getFirst();
            if (len < bb.remaining()) {
                bb.get(b, off, len);
                incrReadByteCount(len);
                return olen;
            }
            int rem = bb.remaining();
            bb.get(b, off, rem);
            incrReadByteCount(rem);
            len -= rem;
            off += rem;
            if (!removeFirstLink(bb)) {
                break;
            }
        }
        return olen - len;
    }