java解壓zip文件示例
若是使用Java自帶的壓縮工具包來實(shí)現(xiàn)解壓縮文件到指定文件夾的功能,因?yàn)閖dk提供的zip只能按UTF-8格式處理,而Windows系統(tǒng)中文件名是以GBK方式編碼的,所以如果是解壓一個(gè)包含中文文件名的zip包,會(huì)報(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)文章
Java for-each循環(huán)使用難題2例(高級使用方法)
從Java5起,在Java中有了for-each循環(huán),可以用來循環(huán)遍歷collection和array。For each循環(huán)允許你在無需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時(shí)無需調(diào)用while循環(huán)中的hasNext()方法就能遍歷collection2014-04-04
使用SpringBoot+Prometheus+Grafana實(shí)現(xiàn)可視化監(jiān)控
本文主要給大家介紹了如何使用Spring?actuator+監(jiān)控組件prometheus+數(shù)據(jù)可視化組件grafana來實(shí)現(xiàn)對Spring?Boot應(yīng)用的可視化監(jiān)控,文中有詳細(xì)的代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-02-02
Maven?繼承父工程時(shí)的relativePath標(biāo)簽詳細(xì)解析
這篇文章主要介紹了Maven?繼承父工程時(shí)的relativePath標(biāo)簽解析,通過本文學(xué)習(xí)你需要注意子模塊想要用父模塊pom中的版本,請注意配置relativePath屬性,需要的朋友可以參考下2022-12-12
Java實(shí)現(xiàn)堆排序(Heapsort)實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)堆排序(Heapsort)實(shí)例代碼,有需要的朋友可以參考一下2013-12-12
Java?生成透明圖片的設(shè)置實(shí)現(xiàn)demo
這篇文章主要為大家介紹了Java?生成透明圖片的設(shè)置實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java中MapStruct對象映射的實(shí)現(xiàn)
MapStruct是一種Java實(shí)體類映射框架,本文就來介紹一下Java中MapStruct對象映射的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
Java While循環(huán) do-while循環(huán)用法
循環(huán)語句就是讓計(jì)算機(jī)根據(jù)條件做循環(huán)計(jì)算,在條件滿足時(shí)繼續(xù)循環(huán),條件不滿足時(shí)退出循環(huán),需要的朋友可以參考下2020-11-11

