您的位置:首页 > 编程语言 > Java开发

关于java解压zip与rar的问题

2010-10-14 18:21 796 查看
这两天,因为项目需要,涉及到文件夹的上传,想了很久,在网上也找了一些资料,都没有什么很好的办法,都是用插件之类的解决,后面就想到了上传压缩文件,说到压缩文件,自然就会遇到,文件的解压缩问题,大家都知道,比较常见的压缩文件有rar,zip,然而rar,zip的区别又在哪?说一点,zip 压缩算法是免费开放的,任何人可以免费使用。但是 RAR 就不一样了,
这个压缩算法已经受到专利权的保护,如果要使用 RAR 算法必须向其专利所有人支付费用。所以在一般的开源网站,像apache,sourceforge等开源网站上的开源项目一般都用zip格式.本人所学语言主要为java自然会想用java去解压,用java去解压zip比较容易,有apache提供的开源项目ant,我在网上找一下,找到了sourceforge的开源项目unrar专用于压缩,解压rar.只可惜没有文档(让人即喜,又悲).

下面是一个对zip,rar进行解压的程序(从http://topic.csdn.net/u/20090227/11/fd8c30ee-ce56-49be-bdea-d19d22a0da37.html转载,供大家一起享用,另外希望对unrar有比较发解的朋友,能发表一个人见解),

Java代码



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


Java代码



import de.innosystec.unrar.Archive;

import de.innosystec.unrar.Archive;


Java代码



/**

* *

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

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

*

*/

public class Decompression {

private static final int BUFFEREDSIZE = 1024;

/**

* 解压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();

}

}

}

/**

* 解压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

}

}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: