java zip解压套了多层文件夹_Java多层目录打包和解压代码(apache commons compress, io, lang)...

詹杰
2023-12-01

package zip;

import java.io.BufferedOutputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Enumeration;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;

import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;

import org.apache.commons.compress.archivers.zip.ZipFile;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.IOUtils;

import org.apache.commons.lang.StringUtils;

public class Main {

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

Main main = new Main("c:/test1.zip");

main.createZipOut();

main.packToolFiles("C:/test", "");

main.closeZipOut();

main = new Main("c:/test2.zip");

main.createZipOut();

main.packToolFiles("C:/test", "test");

main.closeZipOut();

Main.unZipToFolder("c:/test1.zip", "c:/test1");

Main.unZipToFolder("c:/test2.zip", "c:/test2");

}

private OutputStream out = null;

private BufferedOutputStream bos = null;

private ZipArchiveOutputStream zaos = null;

private String zipFileName = null;

public Main(String zipname) {

this.zipFileName = zipname;

}

public void createZipOut() throws FileNotFoundException, IOException {

File f = new File(zipFileName);

out = new FileOutputStream(f);

bos = new BufferedOutputStream(out);

zaos = new ZipArchiveOutputStream(bos);

zaos.setEncoding("GBK");

}

public void closeZipOut() throws Exception {

zaos.flush();

zaos.close();

bos.flush();

bos.close();

out.flush();

out.close();

}

/**

*把一个目录打包到zip文件中的某目录

* @param dirpath目录绝对地址

* @param pathName  zip中目录

*/

public void packToolFiles(String dirpath, String pathName) throws FileNotFoundException, IOException {

if (StringUtils.isNotEmpty(pathName)) {

pathName = pathName + File.separator;

}

packToolFiles(zaos, dirpath, pathName);

}

/**

*把一个目录打包到一个指定的zip文件中

* @param dirpath目录绝对地址

* @param pathName       zip文件抽象地址

*/

public void packToolFiles(ZipArchiveOutputStream zaos, String dirpath, String pathName) throws FileNotFoundException, IOException {

ByteArrayOutputStream tempbaos = new ByteArrayOutputStream();

BufferedOutputStream tempbos = new BufferedOutputStream(tempbaos);

File dir = new File(dirpath);

//返回此绝对路径下的文件

File[] files = dir.listFiles();

if (files == null || files.length < 1) {

return;

}

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

//判断此文件是否是一个文件夹

if (files[i].isDirectory()) {

packToolFiles(zaos, files[i].getAbsolutePath(), pathName + files[i].getName() + File.separator);

} else {

zaos.putArchiveEntry(new ZipArchiveEntry(pathName + files[i].getName()));

IOUtils.copy(new FileInputStream(files[i].getAbsolutePath()), zaos);

zaos.closeArchiveEntry();

}

}

tempbaos.flush();

tempbaos.close();

tempbos.flush();

tempbos.close();

}

/**

*把一个zip文件解压到一个指定的目录中

* @param zipfilename   zip文件抽象地址

* @param outputdir目录绝对地址

*/

public static void unZipToFolder(String zipfilename, String outputdir) throws IOException {

File zipfile = new File(zipfilename);

if (zipfile.exists()) {

outputdir = outputdir + File.separator;

FileUtils.forceMkdir(new File(outputdir));

ZipFile zf = new ZipFile(zipfile, "GBK");

Enumeration zipArchiveEntrys = zf.getEntries();

while (zipArchiveEntrys.hasMoreElements()) {

ZipArchiveEntry zipArchiveEntry = (ZipArchiveEntry) zipArchiveEntrys.nextElement();

if (zipArchiveEntry.isDirectory()) {

FileUtils.forceMkdir(new File(outputdir + zipArchiveEntry.getName() + File.separator));

} else {

IOUtils.copy(zf.getInputStream(zipArchiveEntry), FileUtils.openOutputStream(new File(outputdir + zipArchiveEntry.getName())));

}

}

} else {

throw new IOException("指定的解压文件不存在:\t" + zipfilename);

}

}

}

 类似资料: