java 文件压缩 解压_java实现文件压缩解压

package com.tobiasy.toolkit.zip;

import com.tobiasy.toolkit.file.FileScan;

import java.io.*;

import java.util.ArrayList;

import java.util.List;

import java.util.zip.ZipEntry;

import java.util.zip.ZipInputStream;

import java.util.zip.ZipOutputStream;

/**

* 压缩、解压工具类

*

* @author tobiasy

* @version v1.0

*/

public class ZipUtil {

/**

* 缓冲器大小

*/

private static final int BUFFER = 1024;

/**

* 扫描某个文件夹下的所有文件

*/

public static List getFiles(File file) {

List files = new ArrayList<>();

File[] tmp = file.listFiles();

for (File f : tmp) {

if (f.isFile()) {

files.add(f);

}

if (f.isDirectory()) {

if (f.listFiles().length != 0) {

files.addAll(getFiles(f));

} else {

files.add(f);

}

}

}

return files;

}

/**

* 取相对路径

* 依据文件名和压缩源路径得到文件在压缩源路径下的相对路径

*

* @param dirPath 压缩源路径

* @param file

* @return 相对路径

*/

private static String getRelativePath(String dirPath, File file) {

File dir = new File(dirPath);

String relativePath = file.getName();

while (true) {

file = file.getParentFile();

if (file == null) {

break;

}

if (file.equals(dir)) {

break;

} else {

relativePath = file.getName() + "/" + relativePath;

}

} // end while

return relativePath;

}

/**

* 创建文件

* 根据压缩包内文件名和解压缩目的路径,创建解压缩目标文件,

* 生成中间目录

*

* @param dstPath 解压缩目的路径

* @param fileName 压缩包内文件名

* @return 解压缩目标文件

* @throws IOException

*/

private static File createFile(String dstPath, String fileName) throws IOException {

String[] dirs = fileName.split("/");//将文件名的各级目录分解

File file = new File(dstPath);

if (dirs.length > 1) {//文件有上级目录

for (int i = 0; i < dirs.length - 1; i++) {

file = new File(file, dirs[i]);//依次创建文件对象知道文件的上一级目录

}

if (!file.exists()) {

file.mkdirs();//文件对应目录若不存在,则创建

System.out.println("mkdirs: " + file.getCanonicalPath());

}

file = new File(file, dirs[dirs.length - 1]);//创建文件

return file;

} else {

if (!file.exists()) {

file.mkdirs();//若目标路径的目录不存在,则创建

System.out.println("mkdirs: " + file.getCanonicalPath());

}

file = new File(file, dirs[0]);//创建文件

return file;

}

}

/**

* 解压缩方法

*

* @param zipFileName 压缩文件名

* @param dstPath 解压目标路径

* @return

*/

public static boolean unzip(String zipFileName, String dstPath) {

System.out.println("zip uncompressing...");

try {

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFileName));

ZipEntry zipEntry = null;

byte[] buffer = new byte[BUFFER];//缓冲器

int readLength = 0;//每次读出来的长度

while ((zipEntry = zipInputStream.getNextEntry()) != null) {

if (zipEntry.isDirectory()) {//若是zip条目目录,则需创建这个目录

File dir = new File(dstPath + "/" + zipEntry.getName());

if (!dir.exists()) {

dir.mkdirs();

System.out.println("mkdirs: " + dir.getCanonicalPath());

continue;//跳出

}

}

File file = createFile(dstPath, zipEntry.getName());//若是文件,则需创建该文件

System.out.println("file created: " + file.getCanonicalPath());

OutputStream outputStream = new FileOutputStream(file);

while ((readLength = zipInputStream.read(buffer, 0, BUFFER)) != -1) {

outputStream.write(buffer, 0, readLength);

}

outputStream.close();

System.out.println("file uncompressed: " + file.getCanonicalPath());

} // end while

} catch (FileNotFoundException e) {

System.out.println(e.getMessage());

e.printStackTrace();

System.out.println("unzip fail!");

return false;

} catch (IOException e) {

System.out.println(e.getMessage());

e.printStackTrace();

System.out.println("unzip fail!");

return false;

}

System.out.println("unzip success!");

return true;

}

/**

* 压缩方法

* (可以压缩空的子目录)

*

* @param srcPath 压缩源路径

* @param zipFileName 目标压缩文件

* @return

*/

public static boolean zip(String srcPath, String zipFileName) {

System.out.println("zip compressing...");

File srcFile = new File(srcPath);

List fileList = FileScan.getFiles(srcFile);//所有要压缩的文件

byte[] buffer = new byte[BUFFER];//缓冲器

ZipEntry zipEntry = null;

int readLength = 0;//每次读出来的长度

try {

ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName));

for (File file : fileList) {

if (file.isFile()) {//若是文件,则压缩这个文件

zipEntry = new ZipEntry(getRelativePath(srcPath, file));

zipEntry.setSize(file.length());

zipEntry.setTime(file.lastModified());

zipOutputStream.putNextEntry(zipEntry);

InputStream inputStream = new BufferedInputStream(new FileInputStream(file));

while ((readLength = inputStream.read(buffer, 0, BUFFER)) != -1) {

zipOutputStream.write(buffer, 0, readLength);

}

inputStream.close();

System.out.println("file compressed: " + file.getCanonicalPath());

} else {//若是目录(即空目录)则将这个目录写入zip条目

zipEntry = new ZipEntry(getRelativePath(srcPath, file) + "/");

zipOutputStream.putNextEntry(zipEntry);

System.out.println("dir compressed: " + file.getCanonicalPath() + "/");

}

} // end for

zipOutputStream.close();

} catch (FileNotFoundException e) {

System.out.println(e.getMessage());

e.printStackTrace();

System.out.println("zip fail!");

return false;

} catch (IOException e) {

System.out.println(e.getMessage());

e.printStackTrace();

System.out.println("zip fail!");

return false;

}

System.out.println("zip success!");

return true;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值