您的位置:首页 > 运维架构 > Apache

java压缩与解压缩(2)使用org.apache.tools.zip

2010-06-18 15:45 666 查看
使用这个API可以解决中文乱码的问题

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

public class CopyOfZipUtils {

private static final int BUFFER = 8192;

private static void log(String msg) {
System.out.println(msg);
}

private static String getFileName(String filePath) {
int index = filePath.indexOf(".");
return filePath.substring(0, index);
}

public static void zip(String sourceFilePath) {
File fileDir = new File(sourceFilePath);
if (fileDir.exists()) {
log(fileDir.getPath() + " Starting Zip ...");
long startTime = System.currentTimeMillis();
doZip(fileDir);
long endTime = System.currentTimeMillis();
long costTime = endTime - startTime;
log("Zip Success!");
log("use time -- " + costTime + " millsec!");
} else {
log("can't find the File!");
}
}

public static void unZip(String zipFilePath) {
File fileDir = new File(zipFilePath);
if (fileDir.exists()) {
log(fileDir.getPath() + " Starting UnZip ...");
long startTime = System.currentTimeMillis();
doUnZip(fileDir);
long endTime = System.currentTimeMillis();
long costTime = endTime - startTime;
log("UnZip Success!");
log("use time -- " + costTime + " millsec!");
} else {
log("can't find the File!");
}
}

public static void doZip(File file) {
List fileList = new ArrayList();
List allFiles = (ArrayList) searchFiles(file.getPath(), fileList);

Object[] fileArray = allFiles.toArray();

BufferedInputStream in = null;
FileInputStream fis = null;
ZipOutputStream zos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file.getParent() + File.separator
+ file.getName() + ".zip");
zos = new ZipOutputStream(new BufferedOutputStream(fos, BUFFER));

zos.setLevel(9);
zos.setEncoding("GBK");

byte[] data = new byte[BUFFER];

for (int i = 0; i < fileArray.length; i++) {
// 设置压缩文件入口entry,为被读取的文件创建压缩条目 具体要压缩的文件
File tempFile = new File(fileArray[i].toString());//c:/test/stat03_temp.xls
String rootStr = file.getPath();//c:/test
String entryStr = null;
// entry以相对路径的形式设置。
// 如果设置不当,会出现拒绝访问等错误
// 分别处理单个文件/目录的entry
if (rootStr.equals(tempFile.getPath())) {
entryStr = tempFile.getName();
} else {
entryStr = tempFile.getPath().substring(
(rootStr + File.separator).length());//stat03_temp.xls
}
log(entryStr);

ZipEntry entry = new ZipEntry(entryStr);
zos.putNextEntry(entry);

fis = new FileInputStream(tempFile);
in = new BufferedInputStream(fis, BUFFER);

int count;
while ((count = in.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count);
}
}

} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (zos != null) {
zos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

public static void doUnZip(File file) {
try {
final int BUFFER = 2048;
BufferedOutputStream dest = null;

//   FileInputStream fis = new FileInputStream(file);
//   CheckedInputStream checksum = new CheckedInputStream(fis,
//     new Adler32());
//   ZipInputStream zis = new ZipInputStream(new BufferedInputStream(
//     checksum));
ZipFile zipFile = new ZipFile(file);
zipFile.getEntries();
java.util.Enumeration e = zipFile.getEntries();

ZipEntry entry;

InputStream in = null;
while (e.hasMoreElements()) {
entry = (ZipEntry)e.nextElement();
log("Extracting: " + entry);
int count;
byte[] data = new byte[BUFFER];
log("unzip to " + getFileName(file.getPath()));

FileOutputStream fos = new FileOutputStream(getFileName(file
.getPath())
+ File.separator + newDir(file, entry.getName()));

in = new BufferedInputStream(zipFile.getInputStream(entry));
dest = new BufferedOutputStream(fos, BUFFER);
while ((count = in.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
in.close();
//   System.out
//     .println("Checksum: " + checksum.getChecksum().getValue());
} catch (Exception e) {
e.printStackTrace();
}
}

//递归把文件及路径信息存放到list里面
public static List searchFiles(String sourceFilePath, List fileList) {
File fileDir = new File(sourceFilePath);
if (fileDir.isDirectory()) {
File[] subfiles = fileDir.listFiles();
for (int i = 0; i < subfiles.length; i++) {
searchFiles(subfiles[i].getPath(), fileList);
}
} else {
fileList.add(fileDir);
}

return fileList;
}

//创建新文件夹
private static String newDir(File file, String entryName) {
//c:/test.zip     stat03_temp.xls
String rootDir = getFileName(file.getPath());//c:/test
log("root:" + rootDir);
int index = entryName.lastIndexOf(file.separator);
String dirStr = new File(rootDir).getParent();//c:/
log(dirStr);
if (index != -1) {

String path = entryName.substring(0, index);
log("new Dir:" + rootDir + file.separator + path);
new File(rootDir + file.separator + path).mkdirs();

log("entry:" + entryName.substring(0, index));
} else {
new File(rootDir).mkdirs();
log("entry:" + entryName);
}
return entryName;

}

public static void main(String[] args) {
//  unZip("c://test.zip");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: