java unzip string_用java实现的zip于unzip的功能(转) | 学步园

最近工作中总是做一件重复的事情,就是对一个zip文件进行解压缩,然后再根据某些配置文件,需要对zip包中的内容进行替换,然后还需要将解压后的文件再压缩,关于压缩和解压缩的方法很多,可以还是选择用java语言来实现这一功能,由于文件的数量比较多,而且又多数都是二进制文件,所以个人觉得不管是复制,还是解压缩,对文件的操作要求都是比较高的,进过再三的比较,最后选用了一位仁兄的推荐的程序,据说这段代码是出自ant.jar的source,具体关于zip和unzip的程序如下:

package com.eric.io;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipFile;

import org.apache.tools.zip.ZipOutputStream;

public class Decompression {

private static final int BUFFEREDSIZE = 1024;

public Decompression() {

}

/**

* 解压zip格式的压缩文件到当前文件夹

*

* @param zipFileName

* @throws Exception

*/

@SuppressWarnings("unchecked")

public synchronized void unzipFile(String zipFileName) throws Exception {

try {

File f = new File(zipFileName);

ZipFile zipFile = new ZipFile(zipFileName);

if ((!f.exists()) && (f.length() <= 0)) {

throw new Exception("要解压的文件不存在!");

}

System.out.println(zipFileName + " was uncompressing....");

String strPath, gbkPath, strtemp;

File tempFile = new File(f.getParent());

strPath = tempFile.getAbsolutePath();

java.util.Enumeration e = zipFile.getEntries();

while (e.hasMoreElements()) {

org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e

.nextElement();

gbkPath = zipEnt.getName();

System.out.println("uncomress:" + zipEnt.getName());

if (zipEnt.isDirectory()) {

strtemp = strPath + "/" + gbkPath;

File dir = new File(strtemp);

dir.mkdirs();

continue;

} else {

// 读写文件

InputStream is = zipFile.getInputStream(zipEnt);

BufferedInputStream bis = new BufferedInputStream(is);

gbkPath = zipEnt.getName();

strtemp = strPath + "/" + gbkPath;

// 建目录

String strsubdir = gbkPath;

for (int i = 0; i < strsubdir.length(); i++) {

if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {

String temp = strPath + "/"

+ strsubdir.substring(0, i);

File subdir = new File(temp);

if (!subdir.exists())

subdir.mkdir();

}

}

FileOutputStream fos = new FileOutputStream(strtemp);

BufferedOutputStream bos = new BufferedOutputStream(fos);

int c;

while ((c = bis.read()) != -1) {

bos.write((byte) c);

}

bos.close();

fos.close();

}

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

}

/**

* 解压zip格式的压缩文件到指定位置

*

* @param zipFileName

* 压缩文件

* @param extPlace

* 解压目录

* @throws Exception

*/

@SuppressWarnings("unchecked")

public synchronized void unzip(String zipFileName, String extPlace)

throws Exception {

try {

(new File(extPlace)).mkdirs();

File f = new File(zipFileName);

ZipFile zipFile = new ZipFile(zipFileName);

if ((!f.exists()) && (f.length() <= 0)) {

throw new Exception("要解压的文件不存在!");

}

String strPath, gbkPath, strtemp;

File tempFile = new File(extPlace);

strPath = tempFile.getAbsolutePath();

java.util.Enumeration e = zipFile.getEntries();

while (e.hasMoreElements()) {

org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e

.nextElement();

gbkPath = zipEnt.getName();

if (zipEnt.isDirectory()) {

strtemp = strPath + File.separator + gbkPath;

File dir = new File(strtemp);

dir.mkdirs();

continue;

} else {

// 读写文件

InputStream is = zipFile.getInputStream(zipEnt);

BufferedInputStream bis = new BufferedInputStream(is);

gbkPath = zipEnt.getName();

strtemp = strPath + File.separator + gbkPath;

// 建目录

String strsubdir = gbkPath;

for (int i = 0; i < strsubdir.length(); i++) {

if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {

String temp = strPath + File.separator

+ strsubdir.substring(0, i);

File subdir = new File(temp);

if (!subdir.exists())

subdir.mkdir();

}

}

FileOutputStream fos = new FileOutputStream(strtemp);

BufferedOutputStream bos = new BufferedOutputStream(fos);

int c;

while ((c = bis.read()) != -1) {

bos.write((byte) c);

}

bos.close();

fos.close();

}

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

}

/**

* 压缩zip格式的压缩文件

*

* @param inputFilename

* 压缩的文件或文件夹及详细路径

* @param zipFilename

* 输出文件名称及详细路径

* @throws IOException

*/

public synchronized void zip(String inputFilename, String zipFilename)

throws IOException {

zip(new File(inputFilename), zipFilename);

}

/**

* 压缩zip格式的压缩文件

*

* @param inputFile

* 需压缩文件

* @param zipFilename

* 输出文件及详细路径

* @throws IOException

*/

public synchronized void zip(File inputFile, String zipFilename)

throws IOException {

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(

zipFilename));

try {

zip(inputFile, out, "");

System.out.println(zipFilename + " was genrated successful....");

} catch (IOException e) {

throw e;

} finally {

out.close();

}

}

/**

* 压缩zip格式的压缩文件

*

* @param inputFile

* 需压缩文件

* @param out

* 输出压缩文件

* @param base

* 结束标识

* @throws IOException

*/

@SuppressWarnings("unused")

private synchronized void zip(File inputFile, ZipOutputStream out,

String base) throws IOException {

System.out.println("compress " + inputFile + " ...");

if (inputFile.isDirectory()) {

File[] inputFiles = inputFile.listFiles();

out.putNextEntry(new ZipEntry(base + "/"));

base = base.length() == 0 ? "" : base + "/";

for (int i = 0; i < inputFiles.length; i++) {

System.out.println("compress file:" + inputFiles[i].getName());

zip(inputFiles[i], out, base + inputFiles[i].getName());

}

} else {

if (base.length() > 0) {

out.putNextEntry(new ZipEntry(base));

} else {

out.putNextEntry(new ZipEntry(inputFile.getName()));

}

FileInputStream in = new FileInputStream(inputFile);

try {

int c;

byte[] by = new byte[BUFFEREDSIZE];

while ((c = in.read(by)) != -1) {

out.write(by, 0, c);

}

} catch (IOException e) {

throw e;

} finally {

in.close();

}

}

}

// public static void main(String[] args) {

// Decompression decompression = new Decompression();

// try {

// decompression.unzipFile("c:/test.zip");

// decompression.unzip("c:/test.zip", "c:/test22");

// decompression.zip("c:/test22", "c:/test222.zip");

// } catch (Exception e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }

// }

}

如果有更好的推荐,希望可以告知。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值