日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java解压zip异常_java解压zip文件示例

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java解压zip异常_java解压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);

}

}

}

總結

以上是生活随笔為你收集整理的java解压zip异常_java解压zip文件示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。