Creating a zip file is a task that can easily be accomplished by using the classes ZipOutputStream and ZipEntry in the java.util.zip package.

First of all, I'm going to present to you a complete code snippet that will create a zip file containing all the files of a specified directory. The resulting zip file has the same name as the given directory, with the .zip extention. The archive will be a valid zip file which can be opened with almost all standard zip archivers, such as WinZip.

Here is the complete code - read on, after the code I'll explain some parts in detail.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; public class CreateZipFile
{ private final int BUFFER_SIZE = 4096; public void addFileToZip(ZipOutputStream zos, File file)
{
byte [] data = new byte[BUFFER_SIZE];
int len; FileInputStream fis = null;
try
{
ZipEntry entry = new ZipEntry(file.getName());
entry.setSize(file.length());
entry.setTime(file.lastModified()); zos.putNextEntry(entry);
fis = new FileInputStream(file); CRC32 crc32 = new CRC32();
while ((len = fis.read(data)) > -1)
{
zos.write(data, 0, len);
crc32.update(data, 0, len);
}
entry.setCrc(crc32.getValue()); zos.closeEntry();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
try
{
if (fis != null)
{
fis.close();
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
} public void createZipFile(String directory)
{
File dir = new File(directory);
if (dir.isDirectory())
{
File [] files = dir.listFiles();
if (files != null)
{
File zip = new File(dir.getName() + ".zip"); FileOutputStream fos = null;
ZipOutputStream zos = null; try
{
fos = new FileOutputStream(zip);
zos = new ZipOutputStream(fos);
zos.setMethod(ZipOutputStream.DEFLATED); for (int i = 0; i < files.length; i++)
{
if (files[i].isFile())
{
System.out.println("Zipping " + files[i].getName());
addFileToZip(zos, files[i]);
}
}
}
catch (FileNotFoundException fnfe)
{
fnfe.printStackTrace();
}
finally
{
if (zos != null)
{
try
{
zos.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
if (fos != null)
{
try
{
fos.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
}
}
else
{
System.out.println(dir.getName() + " is not a directory");
}
} public static void main(String [] args)
{
if (args.length == 1)
{
CreateZipFile czf = new CreateZipFile();
czf.createZipFile(args[0]);
}
else
{
System.out.println("usage: java CreateZipFile directory");
}
} }

The steps that you need to take in order to create a zip file are the following:

  1. open an OutputStream (for example a FileOutputStream)
  2. open a ZipOutputStream
  3. prepare a ZipEntry for each file you would like to add to the zip
  4. write the file data to the prepared ZipEntry
  5. close the ZipEntry
  6. repeat steps 3 through 5 for each additional file you'd like to add
  7. close the ZipOutputStream
  8. close the OutputStream

Let's have a look at steps 3 through 5, which need to be repeated for each file.

    ZipEntry entry = new ZipEntry(file.getName());
entry.setSize(file.length());
entry.setTime(file.lastModified());

A new ZipEntry is created, the name, size and time of the zipped entity are set. Please note that the CRC32 value is not set at this moment. We'll see later on why this is.

    zos.putNextEntry(entry);
fis = new FileInputStream(file);

The entry has now been added to a ZipOutputStream which was passed to this method as an argument. An InputStream is opened to read the contents of the file we would like to zip.

    CRC32 crc32 = new CRC32();
while ((len = fis.read(data)) > -1)
{
zos.write(data, 0, len);
crc32.update(data, 0, len);
}
entry.setCrc(crc32.getValue());

We did not set the CRC32 value when we created the ZipEntry. Now we can make up for this: while we add the data to the ZipOutputStream, we calculate the CRC32 value. The benefit of this approach is that we only need to read the contents of the file once, whereas we would have had to read the file twice should we have wanted to do this up front.

    zos.closeEntry(); 

After all this, we only need to close the ZipEntry we added to the ZipOutputStream. We are now ready to add another entry, or we can close the zip file at this point.

Perhaps a final note on the BUFFER_SIZE I used in this example. It is possible to use a smaller or larger buffer size in the example, but please note that setting a size that's too big or too small will hurt performance.

http://jcsnippets.atspace.com/java/input-output/create-zip-file.html

How do I create a zip file?(转)的更多相关文章

  1. How to create a zip file in NetSuite SuiteScript 2.0 如何在现有SuiteScript中创建和下载ZIP压缩文档

    Background We all knows that: NetSuite filecabinet provided a feature to download a folder to a zip ...

  2. How do I create zip file in Servlet for download?

    原文链接:https://kodejava.org/how-do-i-create-zip-file-in-servlet-for-download/ The example below is a s ...

  3. Java ZIP File Example---refernce

    In this tutorial we are going to see how to ZIP a file in Java. ZIP is an archive file format that e ...

  4. zip file 压缩文件

    有时候我们希望 upload 文件后自动压缩, 可以节省空间. 可以使用微软提供的压缩代码 Install-Package System.IO.Compression.ZipFile -Version ...

  5. ionic build Android错误记录 error in opening zip file

    0.写在前头 运行 :cordova requirements Requirements check results for android: Java JDK: installed 1.8.0 An ...

  6. 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file

    我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...

  7. 解决: org.iq80.leveldb.DBException: IO error: C:\data\trie\000945.sst: Could not create random access file.

    以太坊MPT树的持久化层是采用了leveldb数据库,然而在抽取MPT树代码运行过程中,进行get和write操作时却发生了错误: Caused by: org.fusesource.leveldbj ...

  8. linux下解压大于4G文件提示error: Zip file too big错误的解决办法

    error: Zip file too big (greater than 4294959102 bytes)错误解决办法.zip文件夹大于4GB,在centos下无法正常unzip,需要使用第三方工 ...

  9. maven install 读取jar包时出错;error in opening zip file

    错误信息: [INFO] ------------------------------------------------------------------------ [ERROR] Failed ...

随机推荐

  1. Windows Azure 社区新闻综述(#78 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话.以下是本周的亮点. 博客文章: 博客:Windows Azure BizTalk 服务:如何开 ...

  2. codeforces 487E Tourists

    如果不是uoj上有的话(听说这是China Round),我有可能就错过这道题目了(这是我有史以来为oi写的最长的代码,用了我一天TAT!). 题目 传送门. 一个连通无向图,点上有权,支持两种操作: ...

  3. android绑定Service失败原因

    今天抄一个代码,学习Service,中间Service的绑定一直是失败的. bindService返回false 上网查询的话都是一些,比如说TabHost的问题 发现和自己的问题不一样. 最后想了想 ...

  4. Java读写Word文件常用技术

      Java操作操作Word文件,最近花了几天时间解决使用Word模板导出数据的问题,收集到一些资料分享下. 常见的技术如下: 1.POI(兼容doc.docx文件) 官方网站:http://poi. ...

  5. 基于visual Studio2013解决C语言竞赛题之1017次数

         题目 解决代码及点评 /* 功能:有人说在400, 401, 402, ...499这些数中4这个数字共出现112次,请编程序判定这 种说法是否正确.若正确请打印出'YE ...

  6. SilkTest Q&A 12

    111. 谁能告诉我,正在执行的SilkTest的log是存放在哪里? 答案1: 用下面的命令可以导出文本格式的log "c:/program files/segue/silktest/pa ...

  7. Study notes for Latent Dirichlet Allocation

    1. Topic Models Topic models are based upon the idea that documents are mixtures of topics, where a ...

  8. 从M个数中随机选出N个数的所有组合,有序,(二)

    这就是数学中的 A m n 的选取. 共有   m!/n!种可能.. 同样举一个例子吧.. 从12345这五个数字中随机选取3个数字,要求选出来的这三个数字是有序,也就是说从12345中选出来的是12 ...

  9. ASC(22)H(大数+推公式)

    High Speed Trains Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Su ...

  10. QT工程pro设置实践(with QtCreator)----非弄的像VS一样才顺手?

    源地址:http://my.oschina.net/jinzei/blog/100989?fromerr=DhQJzZQe 相信大家很多和我一样,用多了微软给的便利,用人家的就十分不习惯.于是就琢磨原 ...