import java.io.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.zip.*; public class ZipUtils { /** * 缓冲器大小 */ private static final int BUFFER = 512; /** * 压缩得到的文件的后缀名 */ private static final String SUFFIX = ".zip"; /** * 得到源文件路径的所有文件 * * @param dirFile 压缩源文件路径 */ public static List<File> getAllFile(File dirFile) { List<File> fileList = new ArrayList<>(); File[] files = dirFile.listFiles(); for (File file : files) {//文件 if (file.isFile()) { fileList.add(file); System.out.println("add file:" + file.getName()); } else {//目录 if (file.listFiles().length != 0) {//非空目录 fileList.addAll(getAllFile(file));//把递归文件加到fileList中 } else {//空目录 fileList.add(file); System.out.println("add empty dir:" + file.getName()); } } } return fileList; } /** * 获取相对路径 * * @param dirPath 源文件路径 * @param file 准备压缩的单个文件 */ public static String getRelativePath(String dirPath, File file) { File dirFile = new File(dirPath); String relativePath = file.getName(); while (true) { file = file.getParentFile(); if (file == null) break; if (file.equals(dirFile)) { break; } else { relativePath = file.getName() + "/" + relativePath; } } return relativePath; } /** * @param destPath 解压目标路径 * @param fileName 解压文件的相对路径 */ public static File createFile(String destPath, String fileName) { String[] dirs = fileName.split("/");//将文件名的各级目录分解 File file = new File(destPath); if (dirs.length > 1) {//文件有上级目录 for (int i = 0; i < dirs.length - 1; i++) { file = new File(file, dirs[i]);//依次创建文件对象知道文件的上一级目录 } if (!file.exists()) { file.mkdirs();//文件对应目录若不存在,则创建 try { System.out.println("mkdirs: " + file.getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); } } file = new File(file, dirs[dirs.length - 1]);//创建文件 return file; } else { if (!file.exists()) {//若目标路径的目录不存在,则创建 file.mkdirs(); try { System.out.println("mkdirs: " + file.getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); } } file = new File(file, dirs[0]);//创建文件 return file; } } /** * 没有指定压缩目标路径进行压缩,用默认的路径进行压缩 * * @param dirPath 压缩源文件路径 */ public static void compress(String dirPath) { int firstIndex = dirPath.indexOf("/"); int lastIndex = dirPath.lastIndexOf("/"); String zipFileName = dirPath.substring(0, firstIndex + 1) + dirPath.substring(lastIndex + 1); compress(dirPath, zipFileName); } /** * 压缩文件 * * @param dirPath 压缩源文件路径 * @param zipFileName 压缩目标文件路径 */ public static void compress(String dirPath, String zipFileName) { zipFileName = zipFileName + SUFFIX;//添加文件的后缀名 File dirFile = new File(dirPath); List<File> fileList = getAllFile(dirFile); byte[] buffer = new byte[BUFFER]; ZipEntry zipEntry = null; int readLength = 0; //每次读取出来的长度 try { // 对输出文件做CRC32校验 CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream( zipFileName), new CRC32()); ZipOutputStream zos = new ZipOutputStream(cos); for (File file : fileList) { if (file.isFile()) { //若是文件,则压缩文件 zipEntry = new ZipEntry(getRelativePath(dirPath, file)); // zipEntry.setSize(file.length()); zipEntry.setTime(file.lastModified()); zos.putNextEntry(zipEntry); InputStream is = new BufferedInputStream(new FileInputStream(file)); while ((readLength = is.read(buffer, 0, BUFFER)) != -1) { zos.write(buffer, 0, readLength); } is.close(); System.out.println("file compress:" + file.getCanonicalPath()); } else { //若是空目录,则写入zip条目中 zipEntry = new ZipEntry(getRelativePath(dirPath, file)); zos.putNextEntry(zipEntry); System.out.println("dir compress: " + file.getCanonicalPath() + "/"); } } zos.close(); //最后得关闭流,不然压缩最后一个文件会出错 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 解压 */ public static void decompress(String zipFileName, String destPath) { try { zipFileName = zipFileName + SUFFIX; ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName)); ZipEntry zipEntry = null; byte[] buffer = new byte[BUFFER];//缓冲器 int readLength = 0;//每次读出来的长度 while ((zipEntry = zis.getNextEntry()) != null) { if (zipEntry.isDirectory()) {//若是目录 File file = new File(destPath + "/" + zipEntry.getName()); if (!file.exists()) { file.mkdirs(); System.out.println("mkdirs:" + file.getCanonicalPath()); continue; } }//若是文件 File file = createFile(destPath, zipEntry.getName()); System.out.println("file created: " + file.getCanonicalPath()); OutputStream os = new FileOutputStream(file); while ((readLength = zis.read(buffer, 0, BUFFER)) != -1) { os.write(buffer, 0, readLength); } os.close(); System.out.println("file uncompressed: " + file.getCanonicalPath()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static long getZipTrueSize(String filePath) { long size = 0; ZipFile f; try { f = new ZipFile(filePath); Enumeration<? extends ZipEntry> en = f.entries(); while (en.hasMoreElements()) { size += en.nextElement().getSize(); } } catch (IOException e) { e.printStackTrace(); } return size; } public static void main(String[] args) { long size = getZipTrueSize("D:\\SOFT\\idea\\Apache-Subversion-1.8.13.zip"); System.out.println(size); } }
相关推荐
java 压缩与解压缩工具
`ZipOutputStream`用于创建ZIP格式的压缩文件,而`ZipInputStream`则用于读取并解压缩这些文件。以下是一个简单的压缩文件的示例: ```java import java.io.*; import java.util.zip.*; public class ZipExample {...
在Java编程语言中,文件的压缩与解压缩是常见的数据处理操作,特别是在数据传输、存储优化和备份场景中。本实践项目围绕这个主题展开,包括源代码和相关的论文,为学习者提供了深入理解和应用Java压缩库的机会。以下...
使用Java ZIPInputStream、ZIPOutputStream、ZIPEntity完成对文件、文件夹的压缩与解压缩的封装,代码清晰易懂
(Java毕业设计)JAVA文件压缩与解压缩实践(Java毕业设计)JAVA文件压缩与解压缩实践(Java毕业设计)JAVA文件压缩与解压缩实践(Java毕业设计)JAVA文件压缩与解压缩实践(Java毕业设计)JAVA文件压缩与解压缩实践(Java毕业...
JAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩...
JAVA文件压缩与解压缩实践(源代码+论文) JAVA文件压缩与解压缩实践(源代码+论文) JAVA文件压缩与解压缩实践(源代码+论文) JAVA文件压缩与解压缩实践(源代码+论文) JAVA文件压缩与解压缩实践(源代码+论文) JAVA文件...
java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文)....
JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践...
JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与...
在Java编程语言中,文件的压缩与解压缩是常见的任务,尤其在数据存储、传输以及备份等场景下显得尤为重要。本实践毕设论文主要探讨了如何利用Java进行文件的压缩和解压缩操作,通过源代码程序来实现这一功能。下面...
在Java编程语言中,实现RAR压缩与解压缩是一项常见的任务,尤其在处理大量数据或打包文件以便于传输时。本文将深入探讨如何使用Java来实现这个功能,主要关注`FileUtil.java`文件中的代码实现。 首先,Java本身并不...
Java实现压缩解压缩文件和文件夹(附源码) zip unzip 压缩 解压缩
JAVA文件压缩与解压缩实践(源代码+lw).rarJAVA文件压缩与解压缩实践(源代码+lw).rarJAVA文件压缩与解压缩实践(源代码+lw).rarJAVA文件压缩与解压缩实践(源代码+lw).rarJAVA文件压缩与解压缩实践(源代码+lw).rarJAVA...