用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,今天这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
package oracleTestProject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* @Description ZIP工具类,可设置编码
* @Author lsdeng
* @CreateTime 2020年4月11日 下午18:03:35
* @HistoryLog
*/
public class ApacheZipUtil {
public boolean DeleteTempFile = true; // 是否刪除临时文件标志
public List<String> sFileNames = null; //需要压缩的文件名集合(全路径)
public String zipFileName = ""; //压缩包文件名(全路径)
public String Encoding = "GBK"; //编码方式
public boolean CreateZip() throws Exception {
boolean isCreate = true;
ZipOutputStream out = null;
FileInputStream in = null;
try {
File zipFile = new File(zipFileName);
//1.压缩文件
File srcFile[] = new File[sFileNames.size()];
for (int i = 0; i < sFileNames.size(); i++) {
srcFile[i] = new File(sFileNames.get(i));
}
byte[] byt = new byte[1024];
out = new ZipOutputStream(new FileOutputStream(zipFile));
out.setEncoding(Encoding);
for (int i = 0; i < srcFile.length; i++) {
try{
in = new FileInputStream(srcFile[i]);
out.putNextEntry(new ZipEntry(srcFile[i].getName()));
int length;
while((length=in.read(byt)) > 0){
out.write(byt,0,length);
}
out.closeEntry();
in.close();
}catch (Exception e){
isCreate = false;
e.printStackTrace();
throw new Exception(e);
}finally{
try{
in.close();
}catch (Exception e1){
}
}
}
out.close();
//2.删除服务器上的临时文件
if(DeleteTempFile){
for (int i = 0; i < srcFile.length; i++) {
File temFile = srcFile[i];
if(temFile.exists() && temFile.isFile()){
temFile.delete();
}
}
}
} catch (Exception e) {
isCreate = false;
}finally {
try {
out.close();
in.close();
} catch (IOException e) {
}
}
return isCreate;
}
public boolean isDeleteTempFile() {
return DeleteTempFile;
}
public void setDeleteTempFile(boolean deleteTempFile) {
DeleteTempFile = deleteTempFile;
}
public List<String> getsFileNames() {
return sFileNames;
}
public void setsFileNames(List<String> sFileNames) {
this.sFileNames = sFileNames;
}
public String getZipFileName() {
return zipFileName;
}
public void setZipFileName(String zipFileName) {
this.zipFileName = zipFileName;
}
public String getEncoding() {
return Encoding;
}
public void setEncoding(String encoding) {
Encoding = encoding;
}
}
欢迎交流学习,若有不妥之处,麻烦帮忙指正,非常感谢!