自由屋推书网—热门的小说推荐平台!

你的位置: 首页 > 其他程序

Java实现文件压缩为zip和解压zip压缩包

2022-06-22 10:36:31

这篇文章主要为大家介绍了Java如何实现将文件压缩为zip以及解压zip压缩包,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下!

压缩成.zip

代码如下:

/**
 * 压缩成ZIP
 *
 * @param srcDir   压缩文件夹路径
 * @param out  压缩文件输出流
 * @throws RuntimeException 压缩失败会抛出运行时异常
 */

public static void toZip(String srcDir, OutputStream out) throws RuntimeException {

long start = System.currentTimeMillis();

ZipOutputStream zos = null;

try {

zos = new ZipOutputStream(out);

File sourceFile = new File(srcDir);

compress(sourceFile, zos, sourceFile.getName(), false);

long end = System.currentTimeMillis();

System.out.println("压缩完成,耗时:" + (end - start) + " ms");

} catch (Exception e) {

throw new RuntimeException("zip error from ZipUtils", e);

} finally {

if (zos != null) {

try {

zos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}
}

/**
 * 递归压缩方法
 *
 * @param sourceFile   源文件
 * @param zos  zip输出流
 * @param name 压缩后的名称
 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
 * <p>
 * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
 * @throws Exception
 */
private static void compress(File sourceFile, ZipOutputStream zos, String name,
 boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[BUFFER_SIZE];

if (sourceFile.isFile()) {

// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字

zos.putNextEntry(new ZipEntry(name));

// copy文件到zip输出流中

int len;

FileInputStream in = new FileInputStream(sourceFile);

while ((len = in.read(buf)) != -1) {

zos.write(buf, 0, len);

}

// Complete the entry

zos.closeEntry();

in.close();

} else {

File[] listFiles = sourceFile.listFiles();

if (listFiles == null || listFiles.length == 0) {

// 需要保留原来的文件结构时,需要对空文件夹进行处理

if (KeepDirStructure) {

// 空文件夹的处理

zos.putNextEntry(new ZipEntry(name + "/"));

// 没有文件,不需要文件的copy

zos.closeEntry();
}

} else {

for (File file : listFiles) {

// 判断是否需要保留原来的文件结构

if (KeepDirStructure) {

// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,

// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了

compress(file, zos, name + "/" + file.getName(), KeepDirStructure);

} else {

compress(file, zos, file.getName(), KeepDirStructure);

}


}

}

}

}

测试验证代码:

/**
	 * 测试打包本地的Navicat,输出为zip文件
	 * @throws Exception
	 */
@Test
public void test() throws Exception {
//Navicat路径
String inDir = "E:\\developer\\Navicat";
//打包后输出路径
String outDir = "E:\\developer\\NavicatZip\\Navicat.zip";
OutputStream fileOutputStream = new FileOutputStream(new File(outDir));
ZipUtils.toZip(inDir, fileOutputStream);
}

打包前后的文件如下:

解压.zip

代码如下:

/**
 * 解压zip文件到指定目录
 * @param fileZip
 * @param path_to_dest
 * @throws IOException
 */
public static void readZip(String fileZip,String path_to_dest) throws IOException {

try (FileInputStream fis = new FileInputStream(fileZip);
 ZipInputStream zis =
 new ZipInputStream(new BufferedInputStream(fis))) {

ZipEntry entry;

// 从ZipInputStream读取每个条目,直到没有
// 发现更多条目,返回值为空
// getNextEntry()方法。
while ((entry = zis.getNextEntry()) != null) {
System.out.println("Unzipping: " + entry.getName());

int size;
byte[] buffer = new byte[2048];
File fileOut = new File(path_to_dest+"\\"+entry.getName());
try (FileOutputStream fos =
 new FileOutputStream(fileOut);
 BufferedOutputStream bos =
 new BufferedOutputStream(fos, buffer.length)) {

while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, size);
}
bos.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

测试验证代码:

/**
 * 测试解压本地zip文件
 * @throws Exception
 */
@Test
public void readZip() throws Exception {
//解压后路径
String path_to_dest = "E:\\developer\\NavicatUnzip";
//zip文件路径
String fileZip = "E:\\developer\\NavicatZip\\Navicat.zip";
ZipUtils.readZip(fileZip, path_to_dest);
}

解压前后的文件如下:

编辑推荐

热门小说