记录一下java SE中的文件压缩与解压缩的工具使用
代码如下
public class ZipUtils {
public static final String TAG = "ZIP";
public ZipUtils() {
}
/**
* 解压zip到指定的路径
*
* @param zipFileString ZIP的名称
* @param outPathString 要解压缩路径
* @throws Exception
*/
public static boolean UnZipFolder(String zipFileString, String outPathString) {
try {
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
Log.e(TAG, outPathString + File.separator + szName);
File file = new File(outPathString + File.separator + szName);
if (!file.exists()) {
Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -1) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}
inZip.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public static void UnZipFolder(String zipFileString, String outPathString, String szName) throws Exception {
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
while ((zipEntry = inZip.getNextEntry()) != null) {
//szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
Log.e(TAG, outPathString + File.separator + szName);
File file = new File(outPathString + File.separator + szName);
if (!file.exists()) {
Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -1) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}
inZip.close();
}
/**
* 压缩文件和文件夹
*
* @param srcFileString 要压缩的文件或文件夹
* @param zipFileString 解压完成的Zip路径
* @throws Exception
*/
public static void ZipFolder(String srcFileString, String zipFileString) throws Exception {
//创建ZIP
ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
//创建文件
File file = new File(srcFileString);
//压缩
ZipFiles(file.getParent() + File.separator, file.getName(), outZip);
//完成和关闭
outZip.finish();
outZip.close();
}
public static void ZipFolders(String srcFileString, String zipFileString) throws Exception {
//创建ZIP
ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
//创建文件
File file = new File(srcFileString);
File list[] = file.listFiles();
if(list!=null && list.length>0){
for(int i=0;i<list.length;i++){
if(list[i].isFile()){
ZipEntry zipEntry = new ZipEntry(list[i].getName());
FileInputStream inputStream = new FileInputStream(list[i]);
outZip.putNextEntry(zipEntry);
int len;
byte[] buffer = new byte[4096];
while ((len = inputStream.read(buffer)) != -1) {
outZip.write(buffer, 0, len);
}
outZip.closeEntry();
}else{
//压缩
ZipFiles(list[i].getParent() + File.separator, list[i].getName(), outZip);
}
}
}
//完成和关闭
outZip.finish();
outZip.close();
}
/**
* 压缩文件
*
* @param folderString
* @param fileString
* @param zipOutputSteam
* @throws Exception
*/
private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam) throws Exception {
if (zipOutputSteam == null)
return;
File file = new File(folderString + fileString);
if (file.isFile()) {
ZipEntry zipEntry = new ZipEntry(fileString);
FileInputStream inputStream = new FileInputStream(file);
zipOutputSteam.putNextEntry(zipEntry);
int len;
byte[] buffer = new byte[4096];
while ((len = inputStream.read(buffer)) != -1) {
zipOutputSteam.write(buffer, 0, len);
}
zipOutputSteam.closeEntry();
} else {
//文件夹
String fileList[] = file.list();
//没有子文件和压缩
if (fileList.length <= 0) {
ZipEntry zipEntry = new ZipEntry(fileString + File.separator);
zipOutputSteam.putNextEntry(zipEntry);
zipOutputSteam.closeEntry();
}
//子文件和递归
for (int i = 0; i < fileList.length; i++) {
ZipFiles(folderString, fileString + File.separator + fileList[i], zipOutputSteam);
}
}
}
/**
* 返回zip的文件输入流
*
* @param zipFileString zip的名称
* @param fileString ZIP的文件名
* @return InputStream
* @throws Exception
*/
public static InputStream UpZip(String zipFileString, String fileString) throws Exception {
ZipFile zipFile = new ZipFile(zipFileString);
ZipEntry zipEntry = zipFile.getEntry(fileString);
return zipFile.getInputStream(zipEntry);
}
/**
* 返回ZIP中的文件列表(文件和文件夹)
*
* @param zipFileString ZIP的名称
* @param bContainFolder 是否包含文件夹
* @param bContainFile 是否包含文件
* @return
* @throws Exception
*/
public static List<File> GetFileList(String zipFileString, boolean bContainFolder, boolean bContainFile) throws Exception {
List<File> fileList = new ArrayList<File>();
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
// 获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(szName);
if (bContainFolder) {
fileList.add(folder);
}
} else {
File file = new File(szName);
if (bContainFile) {
fileList.add(file);
}
}
}
inZip.close();
return fileList;
}
}
我自己用的类
public class ZipUtil {
private static ZipCompress zipCompress;
public static void getZipFile(String sourceFileName, String zipFileName) {
zipCompress = new ZipCompress(sourceFileName, zipFileName);
try {
zipCompress.zip();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ZipCompress {
private static final Logger LOGGER = Logger.getLogger(ZipCompress.class);
/**
* @Fields zipFileName <简要描述>: 目的地Zip文件路径<Br/>
*/
private String zipFileName; //
/**
* @Fields sourceFileName <简要描述>: 源文件(待压缩的文件或文件夹)路径<Br/>
*/
private String sourceFileName;
public ZipCompress(String sourceFileName, String zipFileName) {
this.zipFileName = zipFileName;
this.sourceFileName = sourceFileName;
}
public void zip() throws Exception {
// File zipFile = new File(zipFileName);
// System.out.println("压缩中...");
LOGGER.info("ZipCompress#zip() 压缩中... ");
// 创建zip输出流
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
// 创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(out);
File sourceFile = new File(sourceFileName);
// 调用函数
compressSub(out, bos, sourceFile, sourceFile.getName());
bos.close();
out.close();
LOGGER.info("ZipCompress#zip() 压缩完成 ");
}
/**
* <简要描述>: 打包文件夹及其子文件成一个zip包<Br/>
*
*/
public void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base) throws Exception {
// 如果路径为目录(文件夹)
if (sourceFile.isDirectory()) {
// 取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
// 如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
if (flist.length == 0) {
// System.out.println(base + "/");
LOGGER.info(base + "/");
out.putNextEntry(new ZipEntry(base + "/"));
} else {
// 如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
for (int i = 0; i < flist.length; i++) {
compress(out, bos, flist[i], base + "/" + flist[i].getName());
}
}
} else {
// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
out.putNextEntry(new ZipEntry(base));
FileInputStream fos = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fos);
int tag;
// System.out.println(base);
// LOGGER.info(base);
// 将源文件写入到zip文件中
while ((tag = bis.read()) != -1) {
out.write(tag);
}
out.flush();
bis.close();
fos.close();
}
}
/**
* <简要描述>: 只压缩当前文件夹下的子文件及子文件夹 <Br/>
*
*/
public void compressSub(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base)
throws Exception {
if (!sourceFile.isDirectory()) {
compressDir(out, bos, sourceFile, base);
} else {
File[] listFiles = sourceFile.listFiles();
for (File file : listFiles) {
compressDir(out, bos, file, file.getName());
}
}
}
/**
* <简要描述>: 压缩当前文件夹下左右文件及子文件,解压后有一级目录<Br/>
* @param out
* @param bos
* @param sourceFile
* @param base
* @throws Exception
* @return void
*/
public void compressDir(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base)
throws Exception {
// 如果路径为目录(文件夹)
if (sourceFile.isDirectory()) {
// 取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
// 如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
if (flist.length == 0) {
// System.out.println(base + "/");
LOGGER.info(base + "/");
out.putNextEntry(new ZipEntry(base + "/"));
} else {
// 如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
for (int i = 0; i < flist.length; i++) {
compress(out, bos, flist[i], base + "/" + flist[i].getName());
}
}
} else {
// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
out.putNextEntry(new ZipEntry(base));
FileInputStream fos = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fos);
int tag;
LOGGER.info(base);
// 将源文件写入到zip文件中
while ((tag = bis.read()) != -1) {
out.write(tag);
}
out.flush();
bis.close();
fos.close();
}
}
}