java实现文件压缩与解压缩通用方法
压缩与解压缩有时候会用到,特地记录压缩与解压的通用方法,方便日后使用。
一:导包
<!
<dependency
>
<groupId
>net
.lingala
</groupId
>
<artifactId
>zip4j
</artifactId
>
<version
>1.3.3</version
>
</dependency
>
这里可以吧lang3的工具包导入,会使用。
二:写个类实现压缩与解压:
import net
.lingala
.zip4j
.core
.ZipFile
;
import net
.lingala
.zip4j
.exception
.ZipException
;
import net
.lingala
.zip4j
.model
.ZipParameters
;
import net
.lingala
.zip4j
.util
.Zip4jConstants
;
import org
.apache
.commons
.lang3
.StringUtils
;
import java
.io
.File
;
public class CompressUtil {
public static final String COMPRESS_TYPE
= ".zip";
public static String
zip(String src
) {
return zip(src
, null
);
}
private static String
zip(String src
, String password
) {
return zip(src
, null
, password
);
}
private static String
zip(String src
, String dest
, String password
) {
return zip(src
, dest
, true, password
);
}
private static String
zip(String src
, String dest
, boolean isCreateDir
, String password
) {
File srcFile
= new File(src
);
dest
= createDestinationPath(srcFile
, dest
);
ZipParameters parameters
= new ZipParameters();
parameters
.setCompressionMethod(Zip4jConstants
.COMP_DEFLATE
);
parameters
.setCompressionLevel(Zip4jConstants
.DEFLATE_LEVEL_NORMAL
);
if (password
!= null
&& !"".equals(password
)) {
parameters
.setEncryptFiles(true);
parameters
.setEncryptionMethod(Zip4jConstants
.ENC_METHOD_STANDARD
);
parameters
.setPassword(password
.toCharArray());
}
try {
ZipFile zipFile
= new ZipFile(dest
);
if (srcFile
.isDirectory()) {
if (!isCreateDir
) {
File
[] subFiles
= srcFile
.listFiles();
int num
= 0;
if (subFiles
!= null
) {
num
= subFiles
.length
;
for (int i
= 0; i
< num
; i
++) {
if (subFiles
[i
].isDirectory()) {
zip(subFiles
[i
].getAbsolutePath(), dest
, isCreateDir
, password
);
} else {
zipFile
.addFile(subFiles
[i
], parameters
);
}
}
return dest
;
}
zipFile
.addFolder(srcFile
, parameters
);
}
} else {
zipFile
.addFile(srcFile
, parameters
);
}
return dest
;
} catch (Exception e
) {
e
.printStackTrace();
}
return null
;
}
private static String
createDestinationPath(File srcFile
, String dest
) {
if (dest
== null
|| "".equals(dest
)) {
if (srcFile
.isDirectory()) {
dest
= srcFile
.getParent() + File
.separator
+ srcFile
.getName() + COMPRESS_TYPE
;
} else {
String fileName
= srcFile
.getName().substring(0, srcFile
.getName().lastIndexOf("."));
dest
= srcFile
.getParent() + File
.separator
+ fileName
+ COMPRESS_TYPE
;
}
} else {
createDestinationPath(dest
);
if (dest
.endsWith(File
.separator
)) {
String fileName
= "";
if (srcFile
.isDirectory()) {
fileName
= srcFile
.getName();
} else {
fileName
= srcFile
.getName().substring(0, srcFile
.getName().lastIndexOf("."));
}
dest
+= fileName
+ COMPRESS_TYPE
;
}
}
return dest
;
}
private static boolean createDestinationPath(String dest
) {
File destDir
= null
;
if (dest
.endsWith(File
.separator
)) {
destDir
= new File(dest
);
} else {
destDir
= new File(dest
.substring(0, dest
.lastIndexOf(File
.separator
)));
}
if (!destDir
.exists()) {
return destDir
.mkdirs();
}
return false;
}
public static void unZip(String unZipBeforeFile
) {
File src
= new File(unZipBeforeFile
);
String destName
= src
.getParent() + File
.separator
;
unZip(unZipBeforeFile
, destName
);
}
private static void unZip(String unZipBeforeFile
, String destName
) {
unZip(unZipBeforeFile
, destName
, null
);
}
private static void unZip(String unZipBeforeFile
, String destName
, String password
) {
try {
File file
= new File(unZipBeforeFile
);
ZipFile zipFile
= new ZipFile(file
);
zipFile
.setFileNameCharset("UTF-8");
if (!zipFile
.isValidZipFile()) {
throw new ZipException("压缩文件不合法,可能损坏");
}
File f
= new File(destName
);
if (f
.isDirectory() && !f
.exists()) {
f
.mkdir();
}
if (zipFile
.isEncrypted() && StringUtils
.isBlank(password
)) {
zipFile
.setPassword(password
.toCharArray());
}
zipFile
.extractAll(destName
);
} catch (ZipException e
) {
e
.printStackTrace();
}
}
public static void main(String
[] args
) {
unZip("E:\\0305新项目\\123\\Redis.zip");
}
}
东西不难,只是临时用的时候找不到的话就只能去网上找,往往网上又是之言片语或者千奇百怪,自己记录通用方法方便自己。积小流成江海,积跬步至千里。