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);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值