Java压缩和解压文件工具类ZipUtil
发布时间:2020-12-15 03:23:24 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 用于服务器端打包文件的,将压缩后的文件写入到response输出流即可实现在服务器端打包下载,支持多级目录嵌套。 测试时可以先用ZipUtil.zip压缩某个文
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考
用于服务器端打包文件的,将压缩后的文件写入到response输出流即可实现在服务器端打包下载,支持多级目录嵌套。
测试时可以先用ZipUtil.zip压缩某个文件夹test,得到压缩文件test.zip,然后将文件夹test删除,用ZipUtil.unzip解压test.zip即可还原。 PS:需要解决中文乱码的朋友可以参考此处?http://log-cd.iteye.com/blog/585647 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; 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.ZipInputStream; import java.util.zip.ZipOutputStream; /** * 通过Java的Zip输入输出流实现压缩和解压文件 * * @author liujiduo * */ public final class ZipUtil { private static byte[] buffer = new byte[1024 * 10]; private ZipUtil() { // empty } /** * 压缩文件 * * @param filePath * 待压缩的文件路径 * @return 压缩后的文件 */ public static File zip(String filePath) { File target = null; File source = new File(filePath); if (source.exists()) { // 压缩文件名=源文件名.zip String zipName = source.getName() + ".zip"; target = new File(source.getParent(),zipName); if (target.exists()) { target.delete(); // 删除旧的文件 } FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(target); zos = new ZipOutputStream(new BufferedOutputStream(fos)); // 添加对应的文件Entry addEntry("/",source,zos); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtil.closeQuietly(zos,fos); } } return target; } /** * 扫描添加文件Entry * * @param base * 基路径 * * @param source * 源文件 * @param zos * Zip文件输出流 * @throws IOException */ private static void addEntry(String base,File source,ZipOutputStream zos) throws IOException { // 按目录分级,形如:/aaa/bbb.txt String entry = base + source.getName(); if (source.isDirectory()) { for (File file : source.listFiles()) { // 递归列出目录下的所有文件,添加文件Entry addEntry(entry + "/",file,zos); } } else { FileInputStream fis = null; BufferedInputStream bis = null; try { fis = new FileInputStream(source); bis = new BufferedInputStream(fis,buffer.length); int read = 0; zos.putNextEntry(new ZipEntry(entry)); while ((read = bis.read(buffer,buffer.length)) != -1) { zos.write(buffer,read); } zos.closeEntry(); } finally { IOUtil.closeQuietly(bis,fis); } } } /** * 解压文件 * * @param filePath * 压缩文件路径 */ public static void unzip(String filePath) { File source = new File(filePath); if (source.exists()) { ZipInputStream zis = null; BufferedOutputStream bos = null; try { zis = new ZipInputStream(new FileInputStream(source)); ZipEntry entry = null; while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) { File target = new File(source.getParent(),entry.getName()); if (!target.getParentFile().exists()) { // 创建文件父目录 target.getParentFile().mkdirs(); } // 写入文件 bos = new BufferedOutputStream(new FileOutputStream(target)); int read = 0; while ((read = zis.read(buffer,buffer.length)) != -1) { bos.write(buffer,read); } bos.flush(); } zis.closeEntry(); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtil.closeQuietly(zis,bos); } } } public static void main(String[] args) { String targetPath = "E:Win7壁纸"; File file = ZipUtil.zip(targetPath); System.out.println(file); ZipUtil.unzip("F:Win7壁纸.zip"); } } import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * @author liujiduo * */ public class IOUtil { /** * 关闭一个或多个流对象 * * @param closeables * 可关闭的流对象列表 * @throws IOException */ public static void close(Closeable... closeables) throws IOException { if (closeables != null) { for (Closeable closeable : closeables) { if (closeable != null) { closeable.close(); } } } } /** * 关闭一个或多个流对象 * * @param closeables * 可关闭的流对象列表 */ public static void closeQuietly(Closeable... closeables) { try { close(closeables); } catch (IOException e) { // do nothing } } } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容