import java.io.File;
創(chuàng)新互聯(lián)建站是專業(yè)的嘉興網(wǎng)站建設公司,嘉興接單;提供網(wǎng)站設計制作、做網(wǎng)站,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行嘉興網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
public class ZipCompressorByAnt {
private File zipFile;
/**
* 壓縮文件構造函數(shù)
* @param pathName 最終壓縮生成的壓縮文件:目錄+壓縮文件名.zip
*/
public ZipCompressorByAnt(String finalFile) {
zipFile = new File(finalFile);
}
/**
* 執(zhí)行壓縮操作
* @param srcPathName 需要被壓縮的文件/文件夾
*/
public void compressExe(String srcPathName) {
System.out.println("srcPathName="+srcPathName);
File srcdir = new File(srcPathName);
if (!srcdir.exists()){
throw new RuntimeException(srcPathName + "不存在!");
}
Project prj = new Project();
Zip zip = new Zip();
zip.setProject(prj);
zip.setDestFile(zipFile);
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
//fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夾 eg:zip.setIncludes("*.java");
//fileSet.setExcludes(...); //排除哪些文件或文件夾
zip.addFileset(fileSet);
zip.execute();
}?? ?
}
public class TestZip {
public static void main(String[] args) {
ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\test1.zip ");
zca.compressExe("E:\\test1");
} ?
}
/*如果 出現(xiàn)ant 的 52? 51 50 等版本問題 可以去找對應的ant-1.8.2.jar???? 我開始用的ant-1.10.1.jar 就是這個包版本高了? 一直報verson 52 版本問題*/
件夾又有文件與文件夾(下一個目錄里是文件),純java實現(xiàn),要實
在JDK中有一個zip工具類:
java.util.zip ? ?Provides classes for reading and writing the standard ZIP and
GZIP file formats.
使用此類可以將文件夾或者多個文件進行打包壓縮操作。
在使用之前先了解關鍵方法:
ZipEntry(String name) ????????Creates a new zip entry with the specified name.
使用ZipEntry的構造方法可以創(chuàng)建一個zip壓縮文件包的實例,然后通過ZipOutputStream將待壓縮的文件以流的形式寫進該壓縮包中。具體實現(xiàn)代碼如下:
import?java.io.BufferedInputStream;??
import?java.io.BufferedOutputStream;??
import?java.io.File;??
import?java.io.FileInputStream;??
import?java.io.FileNotFoundException;??
import?java.io.FileOutputStream;??
import?java.io.IOException;??
import?java.util.zip.ZipEntry;??
import?java.util.zip.ZipOutputStream;??
/**?
*?將文件夾下面的文件?
*?打包成zip壓縮文件?
*??
*?@author?admin?
*?
*/??
public?final?class?FileToZip?{??
private?FileToZip(){}??
/**?
*?將存放在sourceFilePath目錄下的源文件,打包成fileName名稱的zip文件,并存放到zipFilePath路徑下?
*?@param?sourceFilePath?:待壓縮的文件路徑?
*?@param?zipFilePath?:壓縮后存放路徑?
*?@param?fileName?:壓縮后文件的名稱?
*?@return?
*/??
public?static?boolean?fileToZip(String?sourceFilePath,String?zipFilePath,String?fileName){??
boolean?flag?=?false;??
File?sourceFile?=?new?File(sourceFilePath);??
FileInputStream?fis?=?null;??
BufferedInputStream?bis?=?null;??
FileOutputStream?fos?=?null;??
ZipOutputStream?zos?=?null;??
if(sourceFile.exists()?==?false){??
System.out.println("待壓縮的文件目錄:"+sourceFilePath+"不存在.");??
}else{??
try?{??
File?zipFile?=?new?File(zipFilePath?+?"/"?+?fileName?+".zip");??
if(zipFile.exists()){??
System.out.println(zipFilePath?+?"目錄下存在名字為:"?+?fileName?+".zip"?+"打包文件.");??
}else{??
File[]?sourceFiles?=?sourceFile.listFiles();??
if(null?==?sourceFiles?||?sourceFiles.length1){??
System.out.println("待壓縮的文件目錄:"?+?sourceFilePath?+?"里面不存在文件,無需壓縮.");??
}else{??
fos?=?new?FileOutputStream(zipFile);??
zos?=?new?ZipOutputStream(new?BufferedOutputStream(fos));??
byte[]?bufs?=?new?byte[1024*10];??
for(int?i=0;isourceFiles.length;i++){??
//創(chuàng)建ZIP實體,并添加進壓縮包??
ZipEntry?zipEntry?=?new?ZipEntry(sourceFiles[i].getName());??
zos.putNextEntry(zipEntry);??
//讀取待壓縮的文件并寫進壓縮包里??
fis?=?new?FileInputStream(sourceFiles[i]);??
bis?=?new?BufferedInputStream(fis,?1024*10);??
int?read?=?0;??
while((read=bis.read(bufs,?0,?1024*10))?!=?-1){??
zos.write(bufs,0,read);??
}??
}??
flag?=?true;??
}??
}??
}?catch?(FileNotFoundException?e)?{??
e.printStackTrace();??
throw?new?RuntimeException(e);??
}?catch?(IOException?e)?{??
e.printStackTrace();??
throw?new?RuntimeException(e);??
}?finally{??
//關閉流??
try?{??
if(null?!=?bis)?bis.close();??
if(null?!=?zos)?zos.close();??
}?catch?(IOException?e)?{??
e.printStackTrace();??
throw?new?RuntimeException(e);??
}??
}??
}??
return?flag;??
}??
public?static?void?main(String[]?args){??
String?sourceFilePath?=?"D:\\TestFile";??
String?zipFilePath?=?"D:\\tmp";??
String?fileName?=?"12700153file";??
boolean?flag?=?FileToZip.fileToZip(sourceFilePath,?zipFilePath,?fileName);??
if(flag){??
System.out.println("文件打包成功!");??
}else{??
System.out.println("文件打包失敗!");??
}??
}??
}
//建立路徑這里 不是很明白
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
要保留zip里面的目錄結構,所以,是先放入當前目錄及上層所有目錄
package?zip;
import?java.io.BufferedInputStream;
import?java.io.BufferedOutputStream;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.util.Enumeration;
import?java.util.zip.CRC32;
import?java.util.zip.CheckedOutputStream;
import?java.util.zip.ZipEntry;
import?java.util.zip.ZipFile;
import?java.util.zip.ZipOutputStream;
import?org.apache.commons.lang3.StringUtils;
public?class?ZipUtil?{
/**
?*?遞歸壓縮文件夾
?*?@param?srcRootDir?壓縮文件夾根目錄的子路徑
?*?@param?file?當前遞歸壓縮的文件或目錄對象
?*?@param?zos?壓縮文件存儲對象
?*?@throws?Exception
?*/
private?static?void?zip(String?srcRootDir,?File?file,?ZipOutputStream?zos)?throws?Exception
{
if?(file?==?null)?
{
return;
}
//如果是文件,則直接壓縮該文件
if?(file.isFile())
{
int?count,?bufferLen?=?1024;
byte?data[]?=?new?byte[bufferLen];
//獲取文件相對于壓縮文件夾根目錄的子路徑
String?subPath?=?file.getAbsolutePath();
int?index?=?subPath.indexOf(srcRootDir);
if?(index?!=?-1)?
{
subPath?=?subPath.substring(srcRootDir.length()?+?File.separator.length());
}
ZipEntry?entry?=?new?ZipEntry(subPath);
zos.putNextEntry(entry);
BufferedInputStream?bis?=?new?BufferedInputStream(new?FileInputStream(file));
while?((count?=?bis.read(data,?0,?bufferLen))?!=?-1)?
{
zos.write(data,?0,?count);
}
bis.close();
zos.closeEntry();
}
//如果是目錄,則壓縮整個目錄
else?
{
//壓縮目錄中的文件或子目錄
File[]?childFileList?=?file.listFiles();
for?(int?n=0;?nchildFileList.length;?n++)
{
childFileList[n].getAbsolutePath().indexOf(file.getAbsolutePath());
zip(srcRootDir,?childFileList[n],?zos);
}
}
}
/**
?*?對文件或文件目錄進行壓縮
?*?@param?srcPath?要壓縮的源文件路徑。如果壓縮一個文件,則為該文件的全路徑;如果壓縮一個目錄,則為該目錄的頂層目錄路徑
?*?@param?zipPath?壓縮文件保存的路徑。注意:zipPath不能是srcPath路徑下的子文件夾
?*?@param?zipFileName?壓縮文件名
?*?@throws?Exception
?*/
public?static?void?zip(String?srcPath,?String?zipPath,?String?zipFileName)?throws?Exception
{
if?(StringUtils.isEmpty(srcPath)?||?StringUtils.isEmpty(zipPath)?||?StringUtils.isEmpty(zipFileName))
{
throw?new?ParameterException(ICommonResultCode.PARAMETER_IS_NULL);
}
CheckedOutputStream?cos?=?null;
ZipOutputStream?zos?=?null;
try
{
File?srcFile?=?new?File(srcPath);
//判斷壓縮文件保存的路徑是否為源文件路徑的子文件夾,如果是,則拋出異常(防止無限遞歸壓縮的發(fā)生)
if?(srcFile.isDirectory()??zipPath.indexOf(srcPath)!=-1)?
{
throw?new?ParameterException(ICommonResultCode.INVALID_PARAMETER,?"zipPath?must?not?be?the?child?directory?of?srcPath.");
}
//判斷壓縮文件保存的路徑是否存在,如果不存在,則創(chuàng)建目錄
File?zipDir?=?new?File(zipPath);
if?(!zipDir.exists()?||?!zipDir.isDirectory())
{
zipDir.mkdirs();
}
//創(chuàng)建壓縮文件保存的文件對象
String?zipFilePath?=?zipPath?+?File.separator?+?zipFileName;
File?zipFile?=?new?File(zipFilePath);
if?(zipFile.exists())
{
//檢測文件是否允許刪除,如果不允許刪除,將會拋出SecurityException
SecurityManager?securityManager?=?new?SecurityManager();
securityManager.checkDelete(zipFilePath);
//刪除已存在的目標文件
zipFile.delete();
}
cos?=?new?CheckedOutputStream(new?FileOutputStream(zipFile),?new?CRC32());
zos?=?new?ZipOutputStream(cos);
//如果只是壓縮一個文件,則需要截取該文件的父目錄
String?srcRootDir?=?srcPath;
if?(srcFile.isFile())
{
int?index?=?srcPath.lastIndexOf(File.separator);
if?(index?!=?-1)
{
srcRootDir?=?srcPath.substring(0,?index);
}
}
//調(diào)用遞歸壓縮方法進行目錄或文件壓縮
zip(srcRootDir,?srcFile,?zos);
zos.flush();
}
catch?(Exception?e)?
{
throw?e;
}
finally?
{
try
{
if?(zos?!=?null)
{
zos.close();
}
}
catch?(Exception?e)
{
e.printStackTrace();
}
}
}
/**
?*?解壓縮zip包
?*?@param?zipFilePath?zip文件的全路徑
?*?@param?unzipFilePath?解壓后的文件保存的路徑
?*?@param?includeZipFileName?解壓后的文件保存的路徑是否包含壓縮文件的文件名。true-包含;false-不包含
?*/
@SuppressWarnings("unchecked")
public?static?void?unzip(String?zipFilePath,?String?unzipFilePath,?boolean?includeZipFileName)?throws?Exception
{
if?(StringUtils.isEmpty(zipFilePath)?||?StringUtils.isEmpty(unzipFilePath))
{
throw?new?ParameterException(ICommonResultCode.PARAMETER_IS_NULL);
}
File?zipFile?=?new?File(zipFilePath);
//如果解壓后的文件保存路徑包含壓縮文件的文件名,則追加該文件名到解壓路徑
if?(includeZipFileName)
{
String?fileName?=?zipFile.getName();
if?(StringUtils.isNotEmpty(fileName))
{
fileName?=?fileName.substring(0,?fileName.lastIndexOf("."));
}
unzipFilePath?=?unzipFilePath?+?File.separator?+?fileName;
}
//創(chuàng)建解壓縮文件保存的路徑
File?unzipFileDir?=?new?File(unzipFilePath);
if?(!unzipFileDir.exists()?||?!unzipFileDir.isDirectory())
{
unzipFileDir.mkdirs();
}
//開始解壓
ZipEntry?entry?=?null;
String?entryFilePath?=?null,?entryDirPath?=?null;
File?entryFile?=?null,?entryDir?=?null;
int?index?=?0,?count?=?0,?bufferSize?=?1024;
byte[]?buffer?=?new?byte[bufferSize];
BufferedInputStream?bis?=?null;
BufferedOutputStream?bos?=?null;
ZipFile?zip?=?new?ZipFile(zipFile);
EnumerationZipEntry?entries?=?(EnumerationZipEntry)zip.entries();
//循環(huán)對壓縮包里的每一個文件進行解壓
while(entries.hasMoreElements())
{
entry?=?entries.nextElement();
//構建壓縮包中一個文件解壓后保存的文件全路徑
entryFilePath?=?unzipFilePath?+?File.separator?+?entry.getName();
//構建解壓后保存的文件夾路徑
index?=?entryFilePath.lastIndexOf(File.separator);
if?(index?!=?-1)
{
entryDirPath?=?entryFilePath.substring(0,?index);
}
else
{
entryDirPath?=?"";
}
entryDir?=?new?File(entryDirPath);
//如果文件夾路徑不存在,則創(chuàng)建文件夾
if?(!entryDir.exists()?||?!entryDir.isDirectory())
{
entryDir.mkdirs();
}
//創(chuàng)建解壓文件
entryFile?=?new?File(entryFilePath);
if?(entryFile.exists())
{
//檢測文件是否允許刪除,如果不允許刪除,將會拋出SecurityException
SecurityManager?securityManager?=?new?SecurityManager();
securityManager.checkDelete(entryFilePath);
//刪除已存在的目標文件
entryFile.delete();
}
//寫入文件
bos?=?new?BufferedOutputStream(new?FileOutputStream(entryFile));
bis?=?new?BufferedInputStream(zip.getInputStream(entry));
while?((count?=?bis.read(buffer,?0,?bufferSize))?!=?-1)
{
bos.write(buffer,?0,?count);
}
bos.flush();
bos.close();
}
}
public?static?void?main(String[]?args)?
{
String?zipPath?=?"d:\\ziptest\\zipPath";
String?dir?=?"d:\\ziptest\\rawfiles";
String?zipFileName?=?"test.zip";
try
{
zip(dir,?zipPath,?zipFileName);
}?
catch?(Exception?e)
{
e.printStackTrace();
}
String?zipFilePath?=?"D:\\ziptest\\zipPath\\test.zip";
String?unzipFilePath?=?"D:\\ziptest\\zipPath";
try?
{
unzip(zipFilePath,?unzipFilePath,?true);
}
catch?(Exception?e)
{
e.printStackTrace();
}
}
}
有三種方式實現(xiàn)java壓縮:
1、jdk自帶的包java.util.zip.ZipOutputStream,不足之處,文件(夾)名稱帶中文時,出現(xiàn)亂碼問題,實現(xiàn)代碼如下:
/**
* 功能:把 sourceDir 目錄下的所有文件進行 zip 格式的壓縮,保存為指定 zip 文件
* @param sourceDir 如果是目錄,eg:D:\\MyEclipse\\first\\testFile,則壓縮目錄下所有文件;
* 如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,則只壓縮本文件
* @param zipFile 最后壓縮的文件路徑和名稱,eg:D:\\MyEclipse\\first\\testFile\\aa.zip
*/
public File doZip(String sourceDir, String zipFilePath) throws IOException {
File file = new File(sourceDir);
File zipFile = new File(zipFilePath);
ZipOutputStream zos = null;
try {
// 創(chuàng)建寫出流操作
OutputStream os = new FileOutputStream(zipFile);
BufferedOutputStream bos = new BufferedOutputStream(os);
zos = new ZipOutputStream(bos);
String basePath = null;
// 獲取目錄
if(file.isDirectory()) {
basePath = file.getPath();
}else {
basePath = file.getParent();
}
zipFile(file, basePath, zos);
}finally {
if(zos != null) {
zos.closeEntry();
zos.close();
}
}
return zipFile;
}
/**
* @param source 源文件
* @param basePath
* @param zos
*/
private void zipFile(File source, String basePath, ZipOutputStream zos)
throws IOException {
File[] files = null;
if (source.isDirectory()) {
files = source.listFiles();
} else {
files = new File[1];
files[0] = source;
}
InputStream is = null;
String pathName;
byte[] buf = new byte[1024];
int length = 0;
try{
for(File file : files) {
if(file.isDirectory()) {
pathName = file.getPath().substring(basePath.length() + 1) + "/";
zos.putNextEntry(new ZipEntry(pathName));
zipFile(file, basePath, zos);
}else {
pathName = file.getPath().substring(basePath.length() + 1);
is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
zos.putNextEntry(new ZipEntry(pathName));
while ((length = bis.read(buf)) 0) {
zos.write(buf, 0, length);
}
}
}
}finally {
if(is != null) {
is.close();
}
}
}
2、使用org.apache.tools.zip.ZipOutputStream,代碼如下,
package net.szh.zip;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
public class ZipCompressor {
static final int BUFFER = 8192;
private File zipFile;
public ZipCompressor(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File file = new File(srcPathName);
if (!file.exists())
throw new RuntimeException(srcPathName + "不存在!");
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void compress(File file, ZipOutputStream out, String basedir) {
/* 判斷是目錄還是文件 */
if (file.isDirectory()) {
System.out.println("壓縮:" + basedir + file.getName());
this.compressDirectory(file, out, basedir);
} else {
System.out.println("壓縮:" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
/** 壓縮一個目錄 */
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
for (int i = 0; i files.length; i++) {
/* 遞歸 */
compress(files[i], out, basedir + dir.getName() + "/");
}
}
/** 壓縮一個文件 */
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3、可以用ant中的org.apache.tools.ant.taskdefs.Zip來實現(xiàn),更加簡單。
package net.szh.zip;
import java.io.File;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
public class ZipCompressorByAnt {
private File zipFile;
public ZipCompressorByAnt(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File srcdir = new File(srcPathName);
if (!srcdir.exists())
throw new RuntimeException(srcPathName + "不存在!");
Project prj = new Project();
Zip zip = new Zip();
zip.setProject(prj);
zip.setDestFile(zipFile);
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
//fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java");
//fileSet.setExcludes(...); 排除哪些文件或文件夾
zip.addFileset(fileSet);
zip.execute();
}
}
測試一下
package net.szh.zip;
public class TestZip {
public static void main(String[] args) {
ZipCompressor zc = new ZipCompressor("E:\\szhzip.zip");
zc.compress("E:\\test");
ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");
zca.compress("E:\\test");
}
}