java解壓zip文件示例
若是使用Java自帶的壓縮工具包來實(shí)現(xiàn)解壓縮文件到指定文件夾的功能,因?yàn)閖dk提供的zip只能按UTF-8格式處理,而Windows系統(tǒng)中文件名是以GBK方式編碼的,所以如果是解壓一個(gè)包含中文文件名的zip包,會報(bào)非法參數(shù)異常,所以要實(shí)現(xiàn)解壓縮,就得對DeflaterOutputStream.java、InflaterInputStream.java、ZipConstants.java、ZipEntry.java、ZipInputStream.java以及ZipOutputStream.java這些相關(guān)的類進(jìn)行修改,過程如下:
因?yàn)閺?J2SE 1.4 開始,Java 編譯器不再支持 import 進(jìn)未命包名的類、接口,所以在創(chuàng)建的Java項(xiàng)目中,一定要新建一個(gè)自己定義的包,包命名的格式一般為學(xué)校域名的逆序+自己的網(wǎng)名,比如cn.edu.xidian.crytoll。
在包內(nèi)新建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基礎(chǔ)類實(shí)現(xiàn)zip壓縮和zip解壓工具類分享
- Java實(shí)現(xiàn)的zip壓縮及解壓縮工具類示例
- Java壓縮文件工具類ZipUtil使用方法代碼示例
- java實(shí)現(xiàn)文件壓縮成zip的工具類
- java中GZIP壓縮解壓類使用實(shí)例
- java使用gzip實(shí)現(xiàn)文件解壓縮示例
- Java解壓zip文件完整代碼分享
- Java解壓zip文件的關(guān)鍵代碼
- Java創(chuàng)建ZIP壓縮文件的方法
- 利用Java實(shí)現(xiàn)zip壓縮/解壓縮
- Java實(shí)現(xiàn)的zip工具類完整實(shí)例
相關(guān)文章
Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解
這篇文章主要為大家介紹了Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05詳解mybatis插入數(shù)據(jù)后返回自增主鍵ID的問題
這篇文章主要介紹了mybatis插入數(shù)據(jù)后返回自增主鍵ID詳解,本文通過場景分析示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07