package com.test.zipFile; 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.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import org.junit.Test; /** * 通过Java的Zip输入输出流实现压缩和解压文件 * */ public class ZipUtil { public ZipUtil() { // empty } /** * 压缩文件 * * @param filePath * 待压缩的文件路径 * @return 压缩后的文件 * @throws Exception */ public static File zip(String filePath) throws Exception { 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 { if (null != zos) { zos.close(); } if (null != fos) { fos.close(); } } } return target; } /** * 扫描添加文件Entry * * @param base * 基路径 * * @param source * 源文件 * @param zos * Zip文件输出流 * @throws IOException */ @SuppressWarnings("resource") private static void addEntry(String base, File source, ZipOutputStream zos) throws Exception { // 按目录分级,形如: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; byte[] buffer = new byte[1024 * 10]; fis = new FileInputStream(source); bis = new BufferedInputStream(fis, buffer.length); int read = 0; zos.putNextEntry(new ZipEntry(entry)); while ((read = bis.read(buffer, 0, buffer.length)) != -1) { zos.write(buffer, 0, read); } zos.closeEntry(); } } /** * 解压文件 * * @param filePath * 压缩文件路径 * @throws Exception */ public static void unzip(String filePath) throws Exception { File source = new File(filePath); if (source.exists()) { ZipInputStream zis = null; BufferedOutputStream bos = null; 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; byte[] buffer = new byte[1024 * 10]; while ((read = zis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, read); } bos.flush(); } zis.closeEntry(); if (null != zis) { zis.close(); } if (null != bos) { bos.close(); } } } public static void main(String[] args) throws Exception { String targetPath = "D:/CSVFile"; File file = ZipUtil.zip(targetPath); System.out.println(file); } @Test public void testZipFile() throws Exception { File sourceFile = new File("D:/aaabb.docx"); InputStream inputStream = new FileInputStream(sourceFile); OutputStream out = new FileOutputStream("d:/aaabbbccc.zip"); ZipOutputStream zipOut = new ZipOutputStream(out); String entry = sourceFile.getName(); zipOut.putNextEntry(new ZipEntry(entry)); // 把要压缩的文件put Entry int b = -1; while ((b = inputStream.read()) != -1) { zipOut.write(b); } zipOut.closeEntry(); zipOut.close(); inputStream.close(); } @Test public void testUnZipFile() throws Exception{ File zipFile = new File("D:/aaabbbccc.zip"); ZipInputStream zipInput = new ZipInputStream(new FileInputStream(zipFile)); ZipEntry nextEntry = zipInput.getNextEntry(); String name = nextEntry.getName(); File outPutFile = new File("d:/uu/"); if(!outPutFile.exists()){ outPutFile.mkdirs(); } FileOutputStream out = new FileOutputStream(outPutFile.getAbsolutePath()+"/"+name); int b = -1; while ( (b = zipInput.read()) != -1 ) { out.write(b); } out.close(); zipInput.closeEntry(); zipInput.close(); } }
java 压缩解压 zip
猜你喜欢
转载自1960370817.iteye.com/blog/2392936
今日推荐
周排行