【java】zip解压缩示例

news/2024/7/23 23:49:56 标签: java, zip

1.代码示例

javascript">import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipUtil {
	/**
	 * 解压文件
	 * @param file		压缩文件
	 * @param targetDir	解压文件输出的目录
	 * @throws IOException
	 */
	public static void unPacket(Path file, Path targetDir) throws IOException {
		if (!Files.exists(targetDir)) {
			Files.createDirectories(targetDir);
		}
		// 创建zip对象
		ZipFile zipFile = new ZipFile(file.toFile());
		try {
			// 读取zip
			try(ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(file))){
				ZipEntry zipEntry = null;
				// 遍历每一个zip
				while ((zipEntry = zipInputStream.getNextEntry()) != null) {
					// 获取zip项目名称
					String entryName = zipEntry.getName();
					// 构建绝对路径
					Path entryFile = targetDir.resolve(entryName);
					if(zipEntry.isDirectory()) {	// 文件夹
						if (!Files.isDirectory(entryFile)) {
							Files.createDirectories(entryFile);
						}
					} else {							// 文件
						// 读取zip项数据流
						try(InputStream zipEntryInputStream = zipFile.getInputStream(zipEntry)){
							try(OutputStream fileOutputStream = Files.newOutputStream(entryFile, StandardOpenOption.CREATE_NEW)){
								byte[] buffer = new byte[4096];
								int length = 0;
								while ((length = zipEntryInputStream.read(buffer)) != -1) {
									fileOutputStream.write(buffer, 0, length);
								}
								fileOutputStream.flush();
							}
						}
					}
				}
			}
		} finally {
			zipFile.close();
		}
	}

	/**
	 * 压缩指定的文件
	 * @param files				目标文件
	 * @param zipFile			生成的压缩文件
	 * @throws IOException
	 */
	public static void packet(Path[] files, Path zipFile) throws IOException {
		OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);
		ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
		try {
			for (Path file : files) {
				if (Files.isDirectory(file)) {
					continue;
				}
				try (InputStream inputStream = Files.newInputStream(file)) {
					// 创建一个压缩项,指定名称
					ZipEntry zipEntry = new ZipEntry(file.getFileName().toString());
					// 添加到压缩流
					zipOutputStream.putNextEntry(zipEntry);
					// 写入数据
					int len = 0;
					byte[] buffer = new byte[1024 * 10];
					while ((len = inputStream.read(buffer)) > 0) {
						zipOutputStream.write(buffer, 0, len);
					}
					zipOutputStream.flush();
				}
			}
			// 完成所有压缩项的添加
			zipOutputStream.closeEntry();
		} finally {
			zipOutputStream.close();
			outputStream.close();
		}
	}

	/**
	 * 压缩指定的目录
	 * @param folder
	 * @param zipFile
	 * @throws IOException
	 */
	public static void packet(Path folder, Path zipFile) throws IOException {
		if (!Files.isDirectory(folder)) {
			throw new IllegalArgumentException(folder.toString() + " 不是合法的文件夹");
		}
		OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);
		ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);

		LinkedList<String> path = new LinkedList<>();

		try {
			Files.walkFileTree(folder, new FileVisitor<Path>() {

				@Override
				public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {

					if (!dir.equals(folder)) {
						// 开始遍历目录
						String folder = dir.getFileName().toString();
						path.addLast(folder);
						// 写入目录
						ZipEntry zipEntry = new ZipEntry(path.stream().collect(Collectors.joining("/", "", "/")));
						try {
							zipOutputStream.putNextEntry(zipEntry);
							zipOutputStream.flush();
						} catch (IOException e) {
							throw new RuntimeException(e);
						}
					}
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
					// 开始遍历文件
					try (InputStream inputStream = Files.newInputStream(file)) {

						// 创建一个压缩项,指定名称
						String fileName = path.size() > 0
								? path.stream().collect(Collectors.joining("/", "", "")) + "/" + file.getFileName().toString()
								: file.getFileName().toString();

						ZipEntry zipEntry = new ZipEntry(fileName);

						// 添加到压缩流
						zipOutputStream.putNextEntry(zipEntry);
						// 写入数据
						int len = 0;
						byte[] buffer = new byte[1024 * 10];
						while ((len = inputStream.read(buffer)) > 0) {
							zipOutputStream.write(buffer, 0, len);
						}

						zipOutputStream.flush();
					} catch (IOException e) {
						throw new RuntimeException(e);
					}
					return FileVisitResult.CONTINUE;
				}
				@Override
				public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
					return FileVisitResult.CONTINUE;
				}
				@Override
				public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
					// 结束遍历目录
					if (!path.isEmpty()) {
						path.removeLast();
					}
					return FileVisitResult.CONTINUE;
				}
			});
			zipOutputStream.closeEntry();
		} finally {
			zipOutputStream.close();
			outputStream.close();
		}
	}
}


http://www.niftyadmin.cn/n/903278.html

相关文章

【java】Mybatis-Plus控制sql语句打印

配置修改 mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

【vue】avue-crud表格树示例

1.效果图 2.前端代码 <template><div class"app-container pull-height"><el-form inline ref"searchForm" v-model"searchForm"><el-form-item label"菜单名称&#xff1a;"><el-input size"small&…

【vue】el-dropdown el-date-picker el-popover不追加到body

<!--:append-to-body"false" el-date-picker el-popover也可使用--> <el-dropdown v-if"editEnable" ><el-button icon"el-icon-plus"></el-button><el-dropdown-menu slot"dropdown" :append-to-body&qu…

【idea】idea2020.1找不到符号

1.说明 1.看了网上一堆&#xff0c;有mvn idea:idea的&#xff0c;有改回默认maven的&#xff0c;有清除缓存的&#xff0c;比比叨一堆&#xff0c;头都痛&#xff0c;我的是这么解决的&#xff0c;看截图。 2.截图 下面这个图可以用默认的&#xff0c;我这用自己的maven库

【vue】zip下载

1.前端 <template><el-button size"medium" click"handleDownload()">下载</el-button> </template><script> import { downloadZip} from ./api export default{name: test,data() {return {}},methods: {handleDownl…

【js】vue跳出for循环

1.使用array.some() //some()当内部return true时跳出整个循环&#xff1a; var array [1,2,3,4,5]; var num 3; array.some(function(data){if(data num) {return true;}console.log(data); });2.使用array.every() //every()当内部return false时跳出整个循环 var array…

【vue】vue-cropper裁剪示例

1.效果示例图 2.依赖包下载 //这里使用0.5.6版本 npm install --save vue-cropper^0.5.6 或者 yarn add vue-cropper^0.5.63.引用 //main.js中添加 import VueCropper from vue-cropper Vue.use(VueCropper) //或者在页面中使用 import { VueCropper } from vue-cropper exp…

【vue】el-time-pick is-range用法时绑定数组问题

1.问题 1.el-time-pick控件is-range用法&#xff0c;当v-model用的是数组时&#xff0c;选择时间会有问题&#xff0c;如图&#xff1a; 2.代码如下 <template><el-time-pickerv-model"time" format"HH:mm:ss"value-format"HH:mm:ss&…