一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java解壓zip文件示例

java解壓zip文件示例

2019-11-12 14:22java教程網 JAVA教程

這篇文章主要介紹了java解壓zip文件示例,在獲得一個以Zip格式壓縮的文件之后,需要將其進行解壓縮,還原成壓縮前的文件,下面是代碼示例

若是使用Java自帶的壓縮工具包來實現解壓縮文件到指定文件夾的功能,因為jdk提供的zip只能按UTF-8格式處理,而Windows系統中文件名是以GBK方式編碼的,所以如果是解壓一個包含中文文件名的zip包,會報非法參數異常,所以要實現解壓縮,就得對DeflaterOutputStream.java、InflaterInputStream.java、ZipConstants.java、ZipEntry.java、ZipInputStream.java以及ZipOutputStream.java這些相關的類進行修改,過程如下:
因為從 J2SE 1.4 開始,Java 編譯器不再支持 import 進未命包名的類、接口,所以在創建的Java項目中,一定要新建一個自己定義的包,包命名的格式一般為學校域名的逆序+自己的網名,比如cn.edu.xidian.crytoll。
在包內新建DeflaterOutputStream類,代碼如下:

DeflaterOutputStream.java:

 

復制代碼代碼如下:

package cn.edu.xdian.crytoll;

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.Deflater;

/**
 * This class implements an output stream filter for compressing data in
 * the "deflate" compression format. It is also used as the basis for other
 * types of compression filters, such as GZIPOutputStream.
 *
 * @see     Deflater
 * @version     1.36, 03/13/06
 * @author  David Connelly
 */
public
class DeflaterOutputStream extends FilterOutputStream {
    /**
     * Compressor for this stream.
     */
    protected Deflater def;

    /**
     * Output buffer for writing compressed data.
     */
    protected byte[] buf;

    /**
     * Indicates that the stream has been closed.
     */

    private boolean closed = false;

    /**
     * Creates a new output stream with the specified compressor and
     * buffer size.
     * @param out the output stream
     * @param def the compressor ("deflater")
     * @param size the output buffer size
     * @exception IllegalArgumentException if size is <= 0
     */
    public DeflaterOutputStream(OutputStream out, Deflater def, int size) {
        super(out);
        if (out == null || def == null) {
            throw new NullPointerException();
        } else if (size <= 0) {
            throw new IllegalArgumentException("buffer size <= 0");
        }
        this.def = def;
        buf = new byte[size];
    }

    /**
     * Creates a new output stream with the specified compressor and
     * a default buffer size.
     * @param out the output stream
     * @param def the compressor ("deflater")
     */
    public DeflaterOutputStream(OutputStream out, Deflater def) {
    this(out, def, 512);
    }

    boolean usesDefaultDeflater = false;

    /**
     * Creates a new output stream with a default compressor and buffer size.
     * @param out the output stream
     */
    public DeflaterOutputStream(OutputStream out) {
    this(out, new Deflater());
        usesDefaultDeflater = true;
    }

    /**
     * Writes a byte to the compressed output stream. This method will
     * block until the byte can be written.
     * @param b the byte to be written
     * @exception IOException if an I/O error has occurred
     */
    public void write(int b) throws IOException {
        byte[] buf = new byte[1];
    buf[0] = (byte)(b & 0xff);
    write(buf, 0, 1);
    }

    /**
     * Writes an array of bytes to the compressed output stream. This
     * method will block until all the bytes are written.
     * @param b the data to be written
     * @param off the start offset of the data
     * @param len the length of the data
     * @exception IOException if an I/O error has occurred
     */
    public void write(byte[] b, int off, int len) throws IOException {
    if (def.finished()) {
        throw new IOException("write beyond end of stream");
    }
        if ((off | len | (off + len) | (b.length - (off + len))) < 0) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }
    if (!def.finished()) {
            // Deflate no more than stride bytes at a time.  This avoids
            // excess copying in deflateBytes (see Deflater.c)
            int stride = buf.length;
            for (int i = 0; i < len; i+= stride) {
                def.setInput(b, off + i, Math.min(stride, len - i));
                while (!def.needsInput()) {
                    deflate();
                }
            }
    }
    }

    /**
     * Finishes writing compressed data to the output stream without closing
     * the underlying stream. Use this method when applying multiple filters
     * in succession to the same output stream.
     * @exception IOException if an I/O error has occurred
     */
    public void finish() throws IOException {
    if (!def.finished()) {
        def.finish();
        while (!def.finished()) {
        deflate();
        }
    }
    }

    /**
     * Writes remaining compressed data to the output stream and closes the
     * underlying stream.
     * @exception IOException if an I/O error has occurred
     */
    public void close() throws IOException {
        if (!closed) {
            finish();
            if (usesDefaultDeflater)
                def.end();
            out.close();
            closed = true;
        }
    }

    /**
     * Writes next block of compressed data to the output stream.
     * @throws IOException if an I/O error has occurred
     */
    protected void deflate() throws IOException {
    int len = def.deflate(buf, 0, buf.length);
    if (len > 0) {
        out.write(buf, 0, len);
    }
    }
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久精品无码人妻无码AV蜜臀 | 狠狠插综合网 | 国产成人91高清精品免费 | 四虎精品成人免费影视 | 丝袜爆操 | 亚洲日韩欧美一区二区在线 | 色婷婷精品 | 无码专区aaaaaa免费视频 | 亚洲色图欧美色 | 情缘1完整版在线观看 | 四虎免费影院4hu永久免费 | 国产剧情麻豆刘玥视频 | 国产成+人+综合+亚洲欧美丁香花 | 国产精品亚洲精品日韩已方 | 草莓视频旧版本 | 精品国产自在天天线2019 | 亚洲 综合 欧美在线视频 | 亚洲成人视屏 | 青青草在线观看 | 亚洲xxxxxhd奶水女人 | 国产a一级毛片爽爽影院 | 三极片在线观看 | 456老汉gay| 俺来操 | 欧美三级做爰全过程 | yy111111免费观看 | 四虎成人免费视频 | 希望影院高清免费观看视频 | 三年片韩国在线 | 爱豆传媒最新视频国产 | 欧美特级特黄a大片免费 | 范冰冰好紧好滑好湿 | 激情综 | 午夜电影三级还珠格格 | 国产卡一卡二卡四卡无卡 | 日韩精品1 | 日韩香蕉网 | 我被黄总征服的全过程 | 精品在线播放视频 | 久久夜色噜噜噜亚洲AV0000 | 女生被爆操|