⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbzip2outputstream.java

📁 java ant的源码!非常值得看的源码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        /* 20 is just a paranoia constant */        this.allowableBlockSize            = (this.blockSize100k * BZip2Constants.baseBlockSize) - 20;    }    private void endBlock() throws IOException {        this.blockCRC = this.crc.getFinalCRC();        this.combinedCRC = (this.combinedCRC << 1) | (this.combinedCRC >>> 31);        this.combinedCRC ^= this.blockCRC;        // empty block at end of file        if (this.last == -1) {            return;        }        /* sort the block and establish posn of original string */        blockSort();        /*          A 6-byte block header, the value chosen arbitrarily          as 0x314159265359 :-).  A 32 bit value does not really          give a strong enough guarantee that the value will not          appear by chance in the compressed datastream.  Worst-case          probability of this event, for a 900k block, is about          2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits.          For a compressed file of size 100Gb -- about 100000 blocks --          only a 48-bit marker will do.  NB: normal compression/          decompression do *not* rely on these statistical properties.          They are only important when trying to recover blocks from          damaged files.        */        bsPutUByte(0x31);        bsPutUByte(0x41);        bsPutUByte(0x59);        bsPutUByte(0x26);        bsPutUByte(0x53);        bsPutUByte(0x59);        /* Now the block's CRC, so it is in a known place. */        bsPutInt(this.blockCRC);        /* Now a single bit indicating randomisation. */        if (this.blockRandomised) {            bsW(1, 1);        } else {            bsW(1, 0);        }        /* Finally, block's contents proper. */        moveToFrontCodeAndSend();    }    private void endCompression() throws IOException {        /*          Now another magic 48-bit number, 0x177245385090, to          indicate the end of the last block.  (sqrt(pi), if          you want to know.  I did want to use e, but it contains          too much repetition -- 27 18 28 18 28 46 -- for me          to feel statistically comfortable.  Call me paranoid.)        */        bsPutUByte(0x17);        bsPutUByte(0x72);        bsPutUByte(0x45);        bsPutUByte(0x38);        bsPutUByte(0x50);        bsPutUByte(0x90);        bsPutInt(this.combinedCRC);        bsFinishedWithStream();    }    /**     * Returns the blocksize parameter specified at construction time.     */    public final int getBlockSize() {        return this.blockSize100k;    }    public void write(final byte[] buf, int offs, final int len)        throws IOException {        if (offs < 0) {            throw new IndexOutOfBoundsException("offs(" + offs + ") < 0.");        }        if (len < 0) {            throw new IndexOutOfBoundsException("len(" + len + ") < 0.");        }        if (offs + len > buf.length) {            throw new IndexOutOfBoundsException("offs(" + offs + ") + len("                                                + len + ") > buf.length("                                                + buf.length + ").");        }        if (this.out == null) {            throw new IOException("stream closed");        }        for (int hi = offs + len; offs < hi;) {            write0(buf[offs++]);        }    }    private void write0(int b) throws IOException {        if (this.currentChar != -1) {            b &= 0xff;            if (this.currentChar == b) {                if (++this.runLength > 254) {                    writeRun();                    this.currentChar = -1;                    this.runLength = 0;                }                // else nothing to do            } else {                writeRun();                this.runLength = 1;                this.currentChar = b;            }        } else {            this.currentChar = b & 0xff;            this.runLength++;        }    }    private static void hbAssignCodes(final int[] code, final byte[] length,                                      final int minLen, final int maxLen,                                      final int alphaSize) {        int vec = 0;        for (int n = minLen; n <= maxLen; n++) {            for (int i = 0; i < alphaSize; i++) {                if ((length[i] & 0xff) == n) {                    code[i] = vec;                    vec++;                }            }            vec <<= 1;        }    }    private void bsFinishedWithStream() throws IOException {        while (this.bsLive > 0) {            int ch = this.bsBuff >> 24;            this.out.write(ch); // write 8-bit            this.bsBuff <<= 8;            this.bsLive -= 8;        }    }    private void bsW(final int n, final int v) throws IOException {        final OutputStream outShadow = this.out;        int bsLiveShadow    = this.bsLive;        int bsBuffShadow    = this.bsBuff;        while (bsLiveShadow >= 8) {            outShadow.write(bsBuffShadow >> 24); // write 8-bit            bsBuffShadow <<= 8;            bsLiveShadow -= 8;        }        this.bsBuff = bsBuffShadow | (v << (32 - bsLiveShadow - n));        this.bsLive = bsLiveShadow + n;    }    private void bsPutUByte(final int c) throws IOException {        bsW(8, c);    }    private void bsPutInt(final int u) throws IOException {        bsW(8, (u >> 24) & 0xff);        bsW(8, (u >> 16) & 0xff);        bsW(8, (u >>  8) & 0xff);        bsW(8,  u        & 0xff);    }    private void sendMTFValues() throws IOException {        final byte[][] len  = this.data.sendMTFValues_len;        final int alphaSize = this.nInUse + 2;        for (int t = N_GROUPS; --t >= 0;) {            byte[] len_t = len[t];            for (int v = alphaSize; --v >= 0;) {                len_t[v] = GREATER_ICOST;            }        }        /* Decide how many coding tables to use */        // assert (this.nMTF > 0) : this.nMTF;        final int nGroups =            (this.nMTF <  200) ? 2            : (this.nMTF <  600) ? 3            : (this.nMTF < 1200) ? 4            : (this.nMTF < 2400) ? 5            : 6;        /* Generate an initial set of coding tables */        sendMTFValues0(nGroups, alphaSize);        /*          Iterate up to N_ITERS times to improve the tables.        */        final int nSelectors = sendMTFValues1(nGroups, alphaSize);        /* Compute MTF values for the selectors. */        sendMTFValues2(nGroups, nSelectors);        /* Assign actual codes for the tables. */        sendMTFValues3(nGroups, alphaSize);        /* Transmit the mapping table. */        sendMTFValues4();        /* Now the selectors. */        sendMTFValues5(nGroups, nSelectors);        /* Now the coding tables. */        sendMTFValues6(nGroups, alphaSize);        /* And finally, the block data proper */        sendMTFValues7(nSelectors);    }    private void sendMTFValues0(final int nGroups, final int alphaSize) {        final byte[][] len  = this.data.sendMTFValues_len;        final int[] mtfFreq = this.data.mtfFreq;        int remF = this.nMTF;        int gs = 0;        for (int nPart = nGroups; nPart > 0; nPart--) {            final int tFreq = remF / nPart;            int ge = gs - 1;            int aFreq = 0;            for (final int a = alphaSize - 1; (aFreq < tFreq) && (ge < a);) {                aFreq += mtfFreq[++ge];            }            if ((ge > gs)                && (nPart != nGroups)                && (nPart != 1)                && (((nGroups - nPart) & 1) != 0)) {                aFreq -= mtfFreq[ge--];            }            final byte[] len_np = len[nPart - 1];            for (int v = alphaSize; --v >= 0;) {                if ((v >= gs) && (v <= ge)) {                    len_np[v] = LESSER_ICOST;                } else {                    len_np[v] = GREATER_ICOST;                }            }            gs = ge + 1;            remF -= aFreq;        }    }    private int sendMTFValues1(final int nGroups, final int alphaSize) {        final Data dataShadow       = this.data;        final int[][] rfreq   = dataShadow.sendMTFValues_rfreq;        final int[] fave      = dataShadow.sendMTFValues_fave;        final short[] cost    = dataShadow.sendMTFValues_cost;        final char[] sfmap    = dataShadow.sfmap;        final byte[] selector = dataShadow.selector;        final byte[][] len    = dataShadow.sendMTFValues_len;        final byte[] len_0 = len[0];        final byte[] len_1 = len[1];        final byte[] len_2 = len[2];        final byte[] len_3 = len[3];        final byte[] len_4 = len[4];        final byte[] len_5 = len[5];        final int nMTFShadow = this.nMTF;        int nSelectors = 0;        for (int iter = 0; iter < N_ITERS; iter++) {            for (int t = nGroups; --t >= 0;) {                fave[t] = 0;                int[] rfreqt = rfreq[t];                for (int i = alphaSize; --i >= 0;) {                    rfreqt[i] = 0;                }            }            nSelectors = 0;            for (int gs = 0; gs < this.nMTF;) {                /* Set group start & end marks. */                /*                  Calculate the cost of this group as coded                  by each of the coding tables.                */                final int ge = Math.min(gs + G_SIZE - 1, nMTFShadow - 1);                if (nGroups == N_GROUPS) {                    // unrolled version of the else-block                    short cost0 = 0;                    short cost1 = 0;                    short cost2 = 0;                    short cost3 = 0;                    short cost4 = 0;                    short cost5 = 0;                    for (int i = gs; i <= ge; i++) {                        final int icv = sfmap[i];                        cost0 += len_0[icv] & 0xff;                        cost1 += len_1[icv] & 0xff;                        cost2 += len_2[icv] & 0xff;                        cost3 += len_3[icv] & 0xff;                        cost4 += len_4[icv] & 0xff;                        cost5 += len_5[icv] & 0xff;                    }                    cost[0] = cost0;                    cost[1] = cost1;                    cost[2] = cost2;                    cost[3] = cost3;                    cost[4] = cost4;                    cost[5] = cost5;                } else {                    for (int t = nGroups; --t >= 0;) {                        cost[t] = 0;                    }                    for (int i = gs; i <= ge; i++) {                        final int icv = sfmap[i];                        for (int t = nGroups; --t >= 0;) {                            cost[t] += len[t][icv] & 0xff;                        }                    }                }                /*                  Find the coding table which is best for this group,                  and record its identity in the selector table.                */                int bt = -1;                for (int t = nGroups, bc = 999999999; --t >= 0;) {                    final int cost_t = cost[t];                    if (cost_t < bc) {                        bc = cost_t;                        bt = t;                    }                }                fave[bt]++;                selector[nSelectors] = (byte) bt;                nSelectors++;                /*                  Increment the symbol frequencies for the selected table.                */                final int[] rfreq_bt = rfreq[bt];                for (int i = gs; i <= ge; i++) {                    rfreq_bt[sfmap[i]]++;                }                gs = ge + 1;            }            /*              Recompute the tables based on the accumulated frequencies.            */            for (int t = 0; t < nGroups; t++) {                hbMakeCodeLengths(len[t], rfreq[t], this.data, alphaSize, 20);            }        }        return nSelectors;    }    private void sendMTFValues2(final int nGroups, final int nSelectors) {        // assert (nGroups < 8) : nGroups;        final Data dataShadow = this.data;        byte[] pos = dataShadow.sendMTFValues2_pos;        for (int i = nGroups; --i >= 0;) {            pos[i] = (byte) i;        }        for (int i = 0; i < nSelectors; i++) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -