为什么压缩完文件跟原来一样大

本文主要讲述:文件的压缩与解压缩

一、压缩成zip文件

文件压缩,指将一个大文件或目录压缩为单个压缩文件。好处是减少磁盘空间更少的,提高文件传输效率。

Java中提供了ZipOutputStream和GZIPOutputStream类供文件压缩使用。

通过测试,本工具类压缩200MB文件,用时8s,压缩后文件大小为150mb,无论从效率上还是从效果上讲,都是可圈可点的。

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;import org.apache.logging.log4j.util.Strings;/** * @param srcDir 压缩文件夹路径 * @param targetDir 压缩后文件的路径名称 * @param KeepDirStructure 是否保留原来的目录结构 * @throws RuntimeException */ public static void toZip(String srcDir, String targetDir, boolean KeepDirStructure) throws RuntimeException { File sourceFile = new File(srcDir); String sourcePath = sourceFile.getParentFile().toString(); String fileName = sourceFile.getName(); ZipOutputStream zos = null; try { FileOutputStream out = null; if (Strings.isEmpty(targetDir)) { if (sourceFile.isDirectory()) { out = new FileOutputStream(new File(sourcePath + "/" + fileName + ".zip")); } else { out = new FileOutputStream(new File(sourcePath + "/" + fileName.substring(0, fileName.lastIndexOf('.')) + ".zip")); } } else { out = new FileOutputStream(new File(targetDir)); } zos = new ZipOutputStream(out); compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure); } catch (Exception e) { throw new RuntimeException("压缩失败!", e); } finally { if (zos != null) { try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } } } private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean isDir) throws Exception { byte[] buf = new byte[2 * 1024]; if (sourceFile.isFile()) { zos.putNextEntry(new ZipEntry(name)); int len; FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1) { zos.write(buf, 0, len); } zos.closeEntry(); in.close(); } else { File[] listFiles = sourceFile.listFiles(); if (listFiles == null || listFiles.length == 0) { if (isDir) { zos.putNextEntry(new ZipEntry(name + "/")); zos.closeEntry(); } } else { for (File file : listFiles) { if (isDir) { compress(file, zos, name + "/" + file.getName(), isDir); } else { compress(file, zos, file.getName(), isDir); } } } } }二、文件解压

通过测试,本工具类解压200MB文件,用时1s,大大超出了笔者的想象。

/** * 解压zip文件 * * @param srcFile 待解压的zip文件 * @param descDir 解压后的存放路径 * @throws IOException **/ public static void unZipFiles(String srcFile, String descDir) throws IOException { File descDirFile = new File(descDir); if (!descDirFile.exists()) { descDirFile.mkdirs(); } ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK")); for (Enumeration entries = zipFile.entries(); entries.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) entries.nextElement(); String zipEntryName = entry.getName(); String outPath = (descDir + "/" + zipEntryName).replaceAll("\\*", "/"); File file = new File(outPath.substring(0, outPath.lastIndexOf('/'))); if (!file.exists()) { file.mkdirs(); } if (new File(outPath).isDirectory()) { continue; } try(InputStream in =zip.getInputStream(entry); OutputStream out =new FileOutputStream(outPath)){ byte[] buf1 = new byte[1024]; int len; while ((len = in.read(buf1)) > 0) { out.write(buf1, 0, len); } }catch(IOException e){ log.error(e.getMessage(),e); } } zipFile.close(); }

今天的分享就到这里,感兴趣的朋友可以点个赞鼓励一下哈。

有哪些java工具类需要笔者分享的,可以在评论区说出你的想法哦~

100个Java工具类之23:文件的压缩与解压缩

本文地址:https://www.cknow.cn/archives/61023

以上内容源自互联网,由百科助手整理汇总,其目的在于收集传播生活技巧,行业技能,本网站不对其真实性、可靠性承担任何法律责任。特此声明!

如发现本站文章存在版权问题,烦请提供版权疑问、侵权链接、联系方式等信息发邮件至candieraddenipc92@gmail.com,我们将及时沟通与处理。