压缩和解压流
-
压缩文件: ZipOutputStream
-
常用方法
方法名 介绍 ZipOutputStream(OutputStream out) 构造方法:创建新的ZIP输出流 public void putNextEntry(ZipEntry e) 开始编写新的ZIP文件条目,并将流定位到条目数据的开头。 public synchronized void write(byte[] b, int off, int len) 将一个字节数组写入当前的ZIP条目数据 public void finish() 完成编写ZIP输出流的内容,而不关闭底层流 public void setComment(String comment) 设置ZIP文件注释
-
-
ZipEntry:条目对象
- public ZipEntry(String name):构造方法。使用指定名称创建新的ZIP条目。
-
解压文件:ZiplnputStream
方法名 介绍 public ZipInputStream(InputStream in) 创建新的zIP输入流。 public ZipEntry getNextEntry() 读取下一个ZIP文件条目并将流定位到该条目数据的开始处。 -
方法解释
- 假如要去压缩一个文件夹,每一个文件就是一个条目
- 每一个条目就是一个ZipEntry,有多少个文件就要有多少个ZipEntry ,然后putNextEntry
-
压缩和解压代码案例
public class CompressionAndDecomperssionDemo { public static void main(String[] args) { // compression("E:\\柠檬灬.zip", new File("E:\\柠檬灬")); decomperssion("E:\\柠檬灬.zip","E:\\柠檬灬"); } /** * 压缩文件 * * @param zipFileName 压缩文件名 * @param targetFile 需要压缩的文件 */ private static void compression(String zipFileName, File targetFile) { System.out.println("正在压缩文件..."); try { // 创建压缩文件流(要生成的压缩文件) ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName)); // 创建缓冲流 BufferedOutputStream bos = new BufferedOutputStream(zos); // 调用压缩方法 zip(zos, targetFile, targetFile.getName(), bos); bos.close(); zos.close(); } catch (FileNotFoundException e) { System.out.println("压缩文件异常"); e.printStackTrace(); } catch (IOException e) { System.out.println("关闭流出现异常"); e.printStackTrace(); } System.out.println("压缩完成"); } /** * 压缩文件的方法 * * @param zos 创建压缩文件流(要生成的压缩文件) * @param targetFile 需要压缩的文件 * @param name 需要压缩的文件名 * @param bos 缓冲流 */ private static void zip(ZipOutputStream zos, File targetFile, String name, BufferedOutputStream bos) throws IOException { // 判断是否是一个目录 if (targetFile.isDirectory()) { // 获取到目录里的全部文件 File[] files = targetFile.listFiles(); // 判断是否为一个空目录 if (files.length == 0) { // 压缩空目录 文件夹记得加/ zos.putNextEntry(new ZipEntry(name + File.separator)); } // 如果不是空目录,说明目录底下还有内容,使用需要递归调用该方法 for (File file : files) { zip(zos, file, name + File.separator + file.getName(), bos); } } else { // 如果是文件就要进行压缩 zos.putNextEntry(new ZipEntry(name)); InputStream is = new FileInputStream(targetFile); BufferedInputStream bis = new BufferedInputStream(is); byte[] bytes = new byte[1024]; int len; while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0, len); } bis.close(); } } /** * 解压文件 * * @param targetFileName 需要解压的文件 * @param parent 解压后存放的地方 */ private static void decomperssion(String targetFileName, String parent) { try { // 构造解压流 ZipInputStream zin = new ZipInputStream(new FileInputStream(targetFileName)); // 每个需要解压的文件 ZipEntry entry = null; // 解压后文件 File file = null; // 如果有文件且不是文件夹就循环遍历解压 while ((entry = zin.getNextEntry()) != null) { // 设置父路径和子目录 file = new File(parent, entry.getName()); // 判断是不是为空的文件夹 if (entry.getName().endsWith("\\")){ // 创建文件夹并跳出循环 file.mkdirs(); continue; } // 判断文件是否存在 if (!file.exists()) { // System.out.println("qq"); // 创建此文件的上级目录 new File(file.getParent()).mkdirs(); } // 写入文件 OutputStream fis = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fis); byte[] bytes = new byte[1024]; int len; while ((len = zin.read(bytes)) != -1) { bos.write(bytes, 0, len); } bos.close(); } System.out.println(file.getAbsolutePath()+"解压成功"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }