(转)java压缩解压缩rar、zip文件

转自http://www.open-open.com/lib/view/open1363592512046.html

package com.test;

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.tar.TarEntry;

import org.apache.tools.tar.TarOutputStream;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipFile;

import org.apache.tools.zip.ZipOutputStream;

import de.innosystec.unrar.Archive;

/**

* @author Every E-mail/MSN:[email protected]

*  QQ:30130942

* @version 创建时间:Feb 26, 2009 6:01:11 PM

* 类说明:压缩、解压文件公用类

*

*/

public class Test {

private static final int BUFFEREDSIZE = 1024;

public Test() {

// TODO Auto-generated constructor stub

}

/**

* 解压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("要解压的文件不存在!");

}

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

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 zipFileName 压缩文件

* @param extPlace 解压目录

* @throws Exception

*/

@SuppressWarnings("unchecked")

public synchronized void unzip(String zipFileName, String extPlace,boolean whether) 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, "");

} 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 {

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++) {

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

}

}

}

/**

* 解压tar格式的压缩文件到指定目录下

* @param tarFileName 压缩文件

* @param extPlace 解压目录

* @throws Exception

*/

public synchronized void untar(String tarFileName, String extPlace) throws Exception{

}

/**

* 压缩tar格式的压缩文件

* @param inputFilename 压缩文件

* @param tarFilename 输出路径

* @throws IOException

*/

public synchronized void tar(String inputFilename, String tarFilename) throws IOException{

tar(new File(inputFilename), tarFilename);

}

/**

* 压缩tar格式的压缩文件

* @param inputFile 压缩文件

* @param tarFilename 输出路径

* @throws IOException

*/

public synchronized void tar(File inputFile, String tarFilename) throws IOException{

TarOutputStream out = new TarOutputStream(new FileOutputStream(tarFilename));

try {

tar(inputFile, out, "");

} catch (IOException e) {

throw e;

} finally {

out.close();

}

}

/**

* 压缩tar格式的压缩文件

* @param inputFile 压缩文件

* @param out 输出文件

* @param base 结束标识

* @throws IOException

*/

@SuppressWarnings("unused")

private synchronized void tar(File inputFile, TarOutputStream out, String base) throws IOException {

if (inputFile.isDirectory()) {

File[] inputFiles = inputFile.listFiles();

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

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

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

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

}

} else {

if (base.length() > 0) {

out.putNextEntry(new TarEntry(base));

} else {

out.putNextEntry(new TarEntry(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();

}

}

}

/**

* 解压rar格式的压缩文件到指定目录下

* @param rarFileName 压缩文件

* @param extPlace 解压目录

* @throws Exception

*/

public synchronized void unrar(String rarFileName, String extPlace) throws Exception{

try {

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

// 构建测解压缩类

Archive archive = new Archive();

archive.setEnabledLog(false); //不输出日志

// 设置rar文件

archive.setFile(rarFileName);

archive.setExtractPath(extPlace);

archive.extractAllFile();

} catch (Exception e) {

// TODO: handle exception

}

}

/**

* 执行实例

* @param args

*/

public static void main(String[] args) throws Exception {

Test decompression=new Test();

//decompression.unzipFile("d:/Inetpub.zip");

//decompression.unzip("d:/Inetpub.zip","d://Inetpub");

//decompression.zip("c:/Inetpub", "c:/Inetpub.zip");

decompression.unrar("d:/FSCapture62.rar", "d:/FSCapture62");

}

}

你可能感兴趣的:((转)java压缩解压缩rar、zip文件)