zip文件压缩

zip文件结构

上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成。

条目在Java中对应ZipEntry类

创建zip压缩文件

知道了zip文件结构之后,大概就知道怎么去创建一个zip压缩文件了。

之前,先了解下创建普通的文件都是经过以下几个步骤:

1、创建文件输出流FileOutputStream fout = new FileOutputStream(new File("XXX"));

2、往文件输出流中写入文件内容,fout.write(XXX);

3、关闭输出流fout.close();

这样,一个普通的创建就是生成了

既然zip压缩文件也是文件,那么它的创建也基本都差不多,只是,zip文件结构跟普通文件有点差别,因为它里面是由条目(ZipEntry)组成的。

所以创建zip压缩文件的步骤如下:

1、创建zip压缩文件输出流

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File("XXX")));

2、创建zip文件条目

ZipEntry entry = new ZipEntry(name)

备注:name指定条目的名称,例如上图显示的client.cer,这里name可以带路径,例如:a/b/c/test.txt,这样就是创建a/b/c这个目录。

3、将条目添加到zip文件输出流

zos.putNextEntry(entry);

4、创建被文件的输入流,读取文件内容,并写入到zip压缩文件输出流。这个时候,写入的内容都属于当前这个条目的。

FileInputStream in = new FileInputStream(new File("XXX"));

byte[]buffer = new byte[1024];

int len = 0;

while((len = in.read(buffer))!=-1){

zos.write(buffer ,0 ,len);

}

     in.close();

5、关闭zip文件输出流

zos.close()

zip乱码问题解决

使用Apache中的org.apache.tools.zip.ZipOutputStream类来替换Java自带的ZipOutputStream类

FileOutputStream fout = new FileOutputStream("f:\\abc.zip");

ZipOutputStream out = new ZipOutputStream(fout);

out.setEncoding("utf-8"); //这条语句时必须的,否则,生成中文条目时,无法打开zip文件或者出现乱码

ZipEntry entry = new ZipEntry("测试文件.txt");

out.putNextEntry(entry);

误解区:

以前都是以为一个文件或者目录就对应zip文件中的一个条目,其实并非一定是这样的。解析如下:

zip文件是以条目来组织,操作zip文件都是基于条目来进行的,因此,每次往条目新增内容时,

得首先创建zip文件条目,并将添加到zip文件输出,之后,zip输出流,才认为之后写入到输出流中的

内容都是属于这个条目,直到zip输出流中新增新的条目。不过一般来正常来说,都是一个文件或者目录就对应zip文件中的一个条目。

正常情况下,一个文件或者目录对应一个条目,如下图:

但是也可以将a.txt、b.txt的内容都只写入的一个条目c.txt

生成的zip文件结果图:

这里可以发现,只要没有重新往zip文件输出流中添加新的条目,那么,所有的内容都是写入当前条目中。

自己封装的一个zip压缩工具类

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.util.ArrayList;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

public class FilleUtils {

/**

* zip压缩文件,默认生成的压缩文件目录与当前需要压缩的文件或者目录同级

* @param filePath  需要压缩的文件或者目录

* @return 返回zip压缩文件路径

*/

public static String zip(String filePath) throws Exception{

System.out.println("压缩中...");

String zipFilePath = null;

File srcFile = new File(filePath);

//获得zip文件路径

if(srcFile.isDirectory()){

zipFilePath = srcFile.getParent() + srcFile.getName() + ".zip";

}

else{

String zipFileName = "";

if(srcFile.getName().indexOf(".")>-1)

zipFileName = srcFile.getName().substring(0 ,srcFile.getName().lastIndexOf(".")) + ".zip";

else

zipFileName = srcFile.getName() + ".zip";

zipFilePath = srcFile.getParent() + zipFileName;

}

//开始进行压缩

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilePath));

BufferedOutputStream bo = new BufferedOutputStream(out);

zip(out, srcFile, srcFile.getName(), bo);

bo.close();

out.close();

System.out.println("压缩完成");

return zipFilePath;

}

/**

* zip压缩文件

* @param filePath

* @param zipFilePath

*/

public static void zip(String filePath ,String zipFilePath) throws Exception{

System.out.println("压缩中...");

File srcFile = new File(filePath);

//检查压缩文件路径是否存在,不存在则创建

File zipFile = new File(zipFilePath);

if(!zipFile.exists()){

zipFile.getParentFile().mkdirs();

}

//开始压缩

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilePath));

BufferedOutputStream bo = new BufferedOutputStream(out);

zip(out, srcFile, srcFile.getName(), bo);

bo.close();

out.close();

System.out.println("压缩完成");

}

/**

* 压缩指定的多个文件或者目录

* @param filePathList

* @param zipFilePath

* @throws Exception

*/

public static void zip(ArrayList<String> filePathList , String zipFilePath) throws Exception{

System.out.println("压缩中...");

//检查压缩文件路径是否存在,不存在则创建

File zipFile = new File(zipFilePath);

if(!zipFile.exists()){

zipFile.getParentFile().mkdirs();

}

//开始压缩

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilePath));

BufferedOutputStream bo = new BufferedOutputStream(out);

if(filePathList==null || filePathList.size()==0){

throw new RuntimeException("没有指定需要压缩的文件");

}

for(String filePath :filePathList){

File srcFile = new File(filePath);

zip(out, srcFile, srcFile.getName(), bo);

}

bo.close();

out.close();

System.out.println("压缩完成");

}

private static void zip(ZipOutputStream out , File srcFile ,String base ,BufferedOutputStream bo) throws Exception{

//如果需要压缩的文件是目录,则进行递归压缩处理

if(srcFile.isDirectory()){

File[] fileList = srcFile.listFiles();

//如果是空目录,也需要将该目录压缩进去,注意,此时zipentry的name必须以“/"结束

if (fileList.length == 0) {

out.putNextEntry(new ZipEntry(base + "/")); // 创建zip压缩进入点base

out.closeEntry();

}

for (int i = 0; i < fileList.length; i++) {

zip(out, fileList[i], base + "/" + fileList[i].getName(), bo); // 递归遍历子文件夹

}

}

else{

out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base

FileInputStream in = new FileInputStream(srcFile);

BufferedInputStream bi = new BufferedInputStream(in);

int b;

while ((b = bi.read()) != -1) {

bo.write(b);

}

bi.close();

in.close(); // 输入流关闭

}

}

}

来自为知笔记(Wiz)

时间: 2024-08-02 19:36:21

zip文件压缩的相关文章

zip文件压缩(转)

zip文件结构 上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成. 条目在Java中对应ZipEntry类 创建zip压缩文件 知道了zip文件结构之后,大概就知道怎么去创建一个zip压缩文件了. 之前,先了解下创建普通的文件都是经过以下几个步骤: 1.创建文件输出流FileOutputStream fout = new FileOutputStream(new File("XXX")); 2.往文件输出流中写入文件内容,fout.write(XXX); 3.关闭输出流

使用commons-compress操作zip文件(压缩和解压缩)

http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可以操作ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200 and bzip2格式的文件,功能比较强大. 在这里写两个用Commons Compress把文件压缩成zip和从zip解压缩的方法. 直接贴上工具类代码: /** * Zip文件工具类 * @a

跨平台的zip文件压缩处理,支持压缩解压文件夹

根据minizip改写的模块,需要zlib支持 输出的接口: 1 #define RG_ZIP_FILE_REPLACE 0 2 #define RG_ZIP_FILE_APPEND 1 3 4 //压缩文件夹目录,递归压缩 5 //szDir是需要压缩的目录,dstLevel是压缩的目录在压缩包里面的层次标识 6 //可直接指定"" 7 //szZipFile压缩包的文件名 8 //replaceFlag指定替换或者是追加进压缩包 9 int DoZipDir(const char*

gzip,zip,bzip2,xz,tar文件压缩和归档

gzip [-d#] 文件   其中#为1-9的数字 gzip + 文件  压缩文件,删除源文件 gzip -d + 文件  解压缩文件,删除源文件 压缩等级:1压缩最差,9压缩最好,6为默认 zcat查看.gz的文本文件内容 bzip2 + 文件  压缩文件,删除源文件 bzip2 -d + 文件  解压缩文件,删除源文件 bzcat查看.bz2的文本文件内容 gzip和bzip2都不能压缩目录 zip和unzip zip  + 压缩后文件名.zip + 文件      压缩文件,源文件不会消

Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php

Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzip 大概流程.. 1 3. 读文件名称ok,但是cant读取到input说NPE.. 2 4. Ant1.8.2.jar 2 5. #---详细code 2 6. 参考 4 1.  Jdk zip 跟apache ant zip 下面实现的功能是zip文件中的图像文件解压到当前目录下,用jdk自带的处

使用zlib解压.apk/.zip文件(Windows&amp;Ubuntu)

前言 前面讲过,解压出apk文件的内容是进行apk分析的第一步,而.apk文件其实就是.zip文件.也就是说首先要实现zip文件的解压缩.本文将分别介绍在Windows和Ubuntu下如何使用zlib这一开源库对zip文件进行解压. ZLIB zlib is designed to be a free, general-purpose, legally unencumbered – that is, not covered by any patents – lossless data-compr

Atitit. 拉开拉链zip文件 最佳实践实施 java c# .net php

Atitit. 拉开拉链zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzip 大概流程.. 1 3. 读文件名ok,可是cant读取到input说NPE.. 2 4. Ant1.8.2.jar 2 5. #---具体code 2 6. 參考 4 1.  Jdk zip 跟apache ant zip 以下实现的功能是zip文件里的图像文件解压到当前文件夹下.用jdk自带的

PHP扩展类ZipArchive实现压缩Zip文件和文件打包下载

1 <?php 2 /** 3 * 关于文件压缩和下载的类 4 * @author tycell 5 * @version 1.0 6 */ 7 class zip_down{ 8 9 protected $file_path; 10 /** 11 * 构造函数 12 * @param [string] $path [传入文件目录] 13 */ 14 public function __construct($path){ 15 $this->file_path=$path; //要打包的根目录

C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件 (ZT)

DotNetZip on CodePlex: http://dotnetzip.codeplex.com/ 详细的可以看源代码--总之感觉比SharpZipLib好用.而且DotNetZip支持VB,C#以及任何.NET语言. 加压:(从CodePlex上偷过来的) using (ZipFile zip = new ZipFile()) { // add this map file into the "images" directory in the zip archive 把这个PN