src/org/nutz/mvc/upload/util/BufferRing.java
private MarkMode mark(byte[] bs, int[] fails) throws IOException {
        RingItem ri = item;
        int re;
        while ((re = ri.mark(bs, fails)) >= 0 && ri.isDone4Mark()) {
            // 结尾匹配 bs 的开始，看不出这是否是一个结束，所以暂时当作
            // 结束标记，并看看下一个节点。如果不是结束，则需要将 r 置到 max
            if (re > 0) {
                // 下一个节点没有加载，加载一下
                if (!ri.next.isLoaded) {
                    ri.next.load(ins);
                    readed += ri.next.max;
                }
                // 如果当前的环节点的 next指向最初节点，说明整个当前的环已经被读满了，
                // 因此所以不能判断这个位置是不是边界
                // 因此做一下记录，下次加载时，本节点应该为头部
                else if (ri.next == this.item) {
                    ri.nextmark = ri.r;
                    return MarkMode.NOT_FOUND;
                }
                // 匹配头部
                if (ri.next.matchHeadingWithRemain(bs, re)) {
                    return MarkMode.FOUND;
                }
                // 没有匹配上，重置当前节点
                else {
                    ri.r = ri.max;
                    ri.nextmark = ri.max;
                }
            }
            if (ri.isStreamEnd)
                break;
            // 指向下一个节点
            ri = ri.next;
            // 保证该节点已经加载了
            if (!ri.isLoaded) {
                ri.load(ins);
                readed += ri.max;
            }
            // 如果已经循环了一圈，退出
            if (ri == item)
                break;
        }
        if (re == -1)
            return MarkMode.FOUND;

        return ri.isStreamEnd ? MarkMode.STREAM_END : MarkMode.NOT_FOUND;
    }
private MarkMode mark(byte[] bs, int[] fails) throws IOException {
        RingItem ri = item;
        int re;
        while ((re = ri.mark(bs, fails)) >= 0 && ri.isDone4Mark()) {
            // 结尾匹配 bs 的开始，看不出这是否是一个结束，所以暂时当作
            // 结束标记，并看看下一个节点。如果不是结束，则需要将 r 置到 max
            if (re > 0) {
                // 下一个节点没有加载，加载一下
                if (!ri.next.isLoaded) {
                    ri.next.load(ins);
                    readed += ri.next.max;
                }
                // 如果当前的环节点的 next指向最初节点，说明整个当前的环已经被读满了，
                // 因此所以不能判断这个位置是不是边界
                // 因此做一下记录，下次加载时，本节点应该为头部
                else if (ri.next == this.item) {
                    ri.nextmark = ri.r;
                    return MarkMode.NOT_FOUND;
                }
                // 匹配头部
                if (ri.next.matchHeadingWithRemain(bs, re)) {
                    return MarkMode.FOUND;
                }
                // 没有匹配上，重置当前节点
                else {
                    ri.r = ri.max;
                    ri.nextmark = ri.max;
                }
            }
            if (ri.isStreamEnd)
                break;
            // 指向下一个节点
            ri = ri.next;
            // 保证该节点已经加载了
            if (!ri.isLoaded) {
                ri.load(ins);
                readed += ri.max;
            }
            // 如果已经循环了一圈，退出
            if (ri == item)
                break;
        }
        if (re == -1)
            return MarkMode.FOUND;

        return ri.isStreamEnd ? MarkMode.STREAM_END : MarkMode.NOT_FOUND;
    }
根据给定的字节数组，在环中作标记，以便 dump

@param bs
数组
@return 标记模式
@throws IOException