zip 解压缩
发布于: 3 小时前
1、读取原压缩包文件,解压缩至临时目录
2、对临时目录中处理过的文件进行压缩
压缩:
public static void zipFile(FtpInfo ftp, String cbZipFileName, String cycleId, String ZipFilePath, String createFilePath) throws Exception {
isChartPathExist(ZipFilePath);
//压缩
String zipFileName = ZipFilePath + cbZipFileName ;
//创建zip输出流
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
//创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(out);
File sourceFile = new File(createFilePath);
//调用函数
compress(out, bos, sourceFile, sourceFile.getName());
bos.close();
out.close();
logger.debug("end zip ...");
}
/**
* compressed file
*
* @param out
* @param bos
* @param sourceFile
* @param base
* @throws Exception
*/
public static void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base) throws Exception {
//如果路径为目录(文件夹)
if (sourceFile.isDirectory()) {
//取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
if (flist.length == 0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
{
logger.debug(base + "/");
out.putNextEntry(new ZipEntry(base + "/"));
} else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
{
for (int i = 0; i < flist.length; i++) {
compress(out, bos, flist[i], flist[i].getName());
}
}
} else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
{
out.putNextEntry(new ZipEntry(base));
try (
FileInputStream fos = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fos);
) {
int tag;
logger.debug(base);
//将源文件写入到zip文件中
while ((tag = bis.read()) != -1) {
bos.write(tag);
}
} catch (Exception e) {
logger.error("IO流异常");
}
}
}
复制代码
解压:
/*** 解压到指定目录*/
public static void unZipFiles(String zipPath,String descDir)throws IOException{
unZipFiles(new File(zipPath), descDir);
}
/**
* 解压文件到指定目录
*/
public static void unZipFiles(File zipFile,String descDir)throws IOException
{
File pathFile = new File(descDir);
if(!pathFile.exists())
{
pathFile.mkdirs();
}
//解决zip文件中有中文目录或者中文文件
ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
for(Enumeration entries = zip.entries(); entries.hasMoreElements();)
{
ZipEntry entry = (ZipEntry)entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
//判断路径是否存在,不存在则创建文件路径
// File file = new File(outPath.substring(0, outPath.lastIndexOf('s')));
// if(!file.exists())
// {
// file.mkdirs();
// }
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
// if(new File(outPath).isDirectory())
// {
// continue;
// }
//输出文件路径信息
System.out.println(outPath);OutputStream out = new FileOutputStream(outPath);byte[] buf1 = new byte[1024];int len;while((len=in.read(buf1))>0){out.write(buf1,0,len);}in.close();out.close();}zip.close();System.out.println("解压完毕**");}
复制代码
判断解压缩路径是否存在
private static void isChartPathExist(String dirPath) {
File file = new File(dirPath);
if (!file.exists()) {
file.mkdirs();
}
}
复制代码
清理本地旧文件
/**
* 清理旧本地文件
* @param date
* @param
* @return
*/
public static boolean clearOldFile(String date, String downloadFilePath, String unZipDownloadFilePath ){
File localPath = new File(unZipDownloadFilePath);
File zipLocalPath = new File(downloadFilePath);
File[] children = localPath.listFiles();
if (children == null) {
logger.error("Children is null collections.");
return false;
}
for (File child : children) {
if(child.isFile() && child.getName()!= null && child.getName().contains(date)){
child.delete();
}
}
File[] zipChildren = zipLocalPath.listFiles();
if (zipChildren == null) {
logger.error("Children is null collections.");
return false;
}
for (File child : zipChildren) {
if(child.isFile() && child.getName()!= null && child.getName().contains(date)){
child.delete();
}
}
return true;
}
复制代码
划线
评论
复制
发布于: 3 小时前阅读数: 3
版权声明: 本文为 InfoQ 作者【拾贝】的原创文章。
原文链接:【http://xie.infoq.cn/article/1d56ab3f68bc4b4760ae64151】。文章转载请联系作者。
拾贝
关注
还未添加个人签名 2019.05.10 加入
还未添加个人简介
评论