龙空技术网

在Java中实现Zip文件的压缩与解压缩

KevinBlandy 412

前言:

现时兄弟们对“zip解压算法”大概比较重视,小伙伴们都需要了解一些“zip解压算法”的相关内容。那么小编也在网摘上搜集了一些关于“zip解压算法””的相关文章,希望同学们能喜欢,我们快快来了解一下吧!

zip这里就不多说了,在网上找了很多代码,都觉得实现不够优雅,所以自己写了一个工具类。

解压zip文件指定的文件进行zip压缩,对指定的目录进行zip压缩ZipUtils

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.file.FileVisitResult;import java.nio.file.FileVisitor;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.StandardOpenOption;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 ZipUtils {	/**	 * 解压文件 	 * @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();		}	}}

原文:

标签: #zip解压算法