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

📄 zipfile.java

📁 Use the links below to download a source distribution of Ant from one of our mirrors. It is good pra
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            off += SHORT;            // FIXME this is actually not very cpu cycles friendly as we are converting from            // dos to java while the underlying Sun implementation will convert            // from java to dos time for internal storage...            long time = dosToJavaTime(ZipLong.getValue(cfh, off));            ze.setTime(time);            off += WORD;            ze.setCrc(ZipLong.getValue(cfh, off));            off += WORD;            ze.setCompressedSize(ZipLong.getValue(cfh, off));            off += WORD;            ze.setSize(ZipLong.getValue(cfh, off));            off += WORD;            int fileNameLen = ZipShort.getValue(cfh, off);            off += SHORT;            int extraLen = ZipShort.getValue(cfh, off);            off += SHORT;            int commentLen = ZipShort.getValue(cfh, off);            off += SHORT;            off += SHORT; // disk number            ze.setInternalAttributes(ZipShort.getValue(cfh, off));            off += SHORT;            ze.setExternalAttributes(ZipLong.getValue(cfh, off));            off += WORD;            byte[] fileName = new byte[fileNameLen];            archive.readFully(fileName);            ze.setName(getString(fileName));            // LFH offset,            OffsetEntry offset = new OffsetEntry();            offset.headerOffset = ZipLong.getValue(cfh, off);            // data offset will be filled later            entries.put(ze, offset);            nameMap.put(ze.getName(), ze);            archive.skipBytes(extraLen);            byte[] comment = new byte[commentLen];            archive.readFully(comment);            ze.setComment(getString(comment));            archive.readFully(signatureBytes);            sig = ZipLong.getValue(signatureBytes);        }    }    private static final int MIN_EOCD_SIZE =        /* end of central dir signature    */ WORD        /* number of this disk             */ + SHORT        /* number of the disk with the     */        /* start of the central directory  */ + SHORT        /* total number of entries in      */        /* the central dir on this disk    */ + SHORT        /* total number of entries in      */        /* the central dir                 */ + SHORT        /* size of the central directory   */ + WORD        /* offset of start of central      */        /* directory with respect to       */        /* the starting disk number        */ + WORD        /* zipfile comment length          */ + SHORT;    private static final int CFD_LOCATOR_OFFSET =        /* end of central dir signature    */ WORD        /* number of this disk             */ + SHORT        /* number of the disk with the     */        /* start of the central directory  */ + SHORT        /* total number of entries in      */        /* the central dir on this disk    */ + SHORT        /* total number of entries in      */        /* the central dir                 */ + SHORT        /* size of the central directory   */ + WORD;    /**     * Searches for the &quot;End of central dir record&quot;, parses     * it and positions the stream at the first central directory     * record.     */    private void positionAtCentralDirectory()        throws IOException {        boolean found = false;        long off = archive.length() - MIN_EOCD_SIZE;        if (off >= 0) {            archive.seek(off);            byte[] sig = ZipOutputStream.EOCD_SIG;            int curr = archive.read();            while (curr != -1) {                if (curr == sig[POS_0]) {                    curr = archive.read();                    if (curr == sig[POS_1]) {                        curr = archive.read();                        if (curr == sig[POS_2]) {                            curr = archive.read();                            if (curr == sig[POS_3]) {                                found = true;                                break;                            }                        }                    }                }                archive.seek(--off);                curr = archive.read();            }        }        if (!found) {            throw new ZipException("archive is not a ZIP archive");        }        archive.seek(off + CFD_LOCATOR_OFFSET);        byte[] cfdOffset = new byte[WORD];        archive.readFully(cfdOffset);        archive.seek(ZipLong.getValue(cfdOffset));    }    /**     * Number of bytes in local file header up to the &quot;length of     * filename&quot; entry.     */    private static final long LFH_OFFSET_FOR_FILENAME_LENGTH =        /* local file header signature     */ WORD        /* version needed to extract       */ + SHORT        /* general purpose bit flag        */ + SHORT        /* compression method              */ + SHORT        /* last mod file time              */ + SHORT        /* last mod file date              */ + SHORT        /* crc-32                          */ + WORD        /* compressed size                 */ + WORD        /* uncompressed size               */ + WORD;    /**     * Walks through all recorded entries and adds the data available     * from the local file header.     *     * <p>Also records the offsets for the data to read from the     * entries.</p>     */    private void resolveLocalFileHeaderData()        throws IOException {        Enumeration e = getEntries();        while (e.hasMoreElements()) {            ZipEntry ze = (ZipEntry) e.nextElement();            OffsetEntry offsetEntry = (OffsetEntry) entries.get(ze);            long offset = offsetEntry.headerOffset;            archive.seek(offset + LFH_OFFSET_FOR_FILENAME_LENGTH);            byte[] b = new byte[SHORT];            archive.readFully(b);            int fileNameLen = ZipShort.getValue(b);            archive.readFully(b);            int extraFieldLen = ZipShort.getValue(b);            archive.skipBytes(fileNameLen);            byte[] localExtraData = new byte[extraFieldLen];            archive.readFully(localExtraData);            ze.setExtra(localExtraData);            /*dataOffsets.put(ze,                            new Long(offset + LFH_OFFSET_FOR_FILENAME_LENGTH                                     + SHORT + SHORT + fileNameLen + extraFieldLen));            */            offsetEntry.dataOffset = offset + LFH_OFFSET_FOR_FILENAME_LENGTH                                     + SHORT + SHORT + fileNameLen + extraFieldLen;        }    }    /**     * Convert a DOS date/time field to a Date object.     *     * @param zipDosTime contains the stored DOS time.     * @return a Date instance corresponding to the given time.     */    protected static Date fromDosTime(ZipLong zipDosTime) {        long dosTime = zipDosTime.getValue();        return new Date(dosToJavaTime(dosTime));    }    /*     * Converts DOS time to Java time (number of milliseconds since epoch).     */    private static long dosToJavaTime(long dosTime) {        Calendar cal = Calendar.getInstance();        // CheckStyle:MagicNumberCheck OFF - no point        cal.set(Calendar.YEAR, (int) ((dosTime >> 25) & 0x7f) + 1980);        cal.set(Calendar.MONTH, (int) ((dosTime >> 21) & 0x0f) - 1);        cal.set(Calendar.DATE, (int) (dosTime >> 16) & 0x1f);        cal.set(Calendar.HOUR_OF_DAY, (int) (dosTime >> 11) & 0x1f);        cal.set(Calendar.MINUTE, (int) (dosTime >> 5) & 0x3f);        cal.set(Calendar.SECOND, (int) (dosTime << 1) & 0x3e);        // CheckStyle:MagicNumberCheck ON        return cal.getTime().getTime();    }    /**     * Retrieve a String from the given bytes using the encoding set     * for this ZipFile.     *     * @param bytes the byte array to transform     * @return String obtained by using the given encoding     * @throws ZipException if the encoding cannot be recognized.     */    protected String getString(byte[] bytes) throws ZipException {        if (encoding == null) {            return new String(bytes);        } else {            try {                return new String(bytes, encoding);            } catch (UnsupportedEncodingException uee) {                throw new ZipException(uee.getMessage());            }        }    }    /**     * InputStream that delegates requests to the underlying     * RandomAccessFile, making sure that only bytes from a certain     * range can be read.     */    private class BoundedInputStream extends InputStream {        private long remaining;        private long loc;        private boolean addDummyByte = false;        BoundedInputStream(long start, long remaining) {            this.remaining = remaining;            loc = start;        }        public int read() throws IOException {            if (remaining-- <= 0) {                if (addDummyByte) {                    addDummyByte = false;                    return 0;                }                return -1;            }            synchronized (archive) {                archive.seek(loc++);                return archive.read();            }        }        public int read(byte[] b, int off, int len) throws IOException {            if (remaining <= 0) {                if (addDummyByte) {                    addDummyByte = false;                    b[off] = 0;                    return 1;                }                return -1;            }            if (len <= 0) {                return 0;            }            if (len > remaining) {                len = (int) remaining;            }            int ret = -1;            synchronized (archive) {                archive.seek(loc);                ret = archive.read(b, off, len);            }            if (ret > 0) {                loc += ret;                remaining -= ret;            }            return ret;        }        /**         * Inflater needs an extra dummy byte for nowrap - see         * Inflater's javadocs.         */        void addDummy() {            addDummyByte = true;        }    }}

⌨️ 快捷键说明

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