How do I create a zip file?(转)
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:
- open an OutputStream (for example a FileOutputStream)
- open a ZipOutputStream
- prepare a ZipEntry for each file you would like to add to the zip
- write the file data to the prepared ZipEntry
- close the ZipEntry
- repeat steps 3 through 5 for each additional file you'd like to add
- close the ZipOutputStream
- 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?(转)的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- zip file 压缩文件
有时候我们希望 upload 文件后自动压缩, 可以节省空间. 可以使用微软提供的压缩代码 Install-Package System.IO.Compression.ZipFile -Version ...
- ionic build Android错误记录 error in opening zip file
0.写在前头 运行 :cordova requirements Requirements check results for android: Java JDK: installed 1.8.0 An ...
- 记一个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 ...
- 解决: 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 ...
- linux下解压大于4G文件提示error: Zip file too big错误的解决办法
error: Zip file too big (greater than 4294959102 bytes)错误解决办法.zip文件夹大于4GB,在centos下无法正常unzip,需要使用第三方工 ...
- maven install 读取jar包时出错;error in opening zip file
错误信息: [INFO] ------------------------------------------------------------------------ [ERROR] Failed ...
随机推荐
- 我的Python成长之路---第一天---Python基础(2)---2015年12月26日(雾霾)
三.数据类型 Python基本类型(能够直接处理的数据类型有以下几种)主要有5种 1.整数(int) Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如 ...
- C++学习笔记(十二):重载函数
1. 什么是重载函数 假设同一作用域内的几个函数名字同样但形參列表不同.那么这些函数就称之为--重载函数. 比如: void print( const char *cp); void print(co ...
- Win32 Windows编程 十二
一.对话框 1.对话框的分类 2.对话框的基本使用方式 3.对话框资源 4.有模式对话框的使用 5. 无模式对话框的使用 5.1 加入对话框资源 5.2 定义窗体处理函数 BOOL CALLBACK ...
- Java集合框架Collection
转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...
- Ch04 充满动作的控制器
4.1 考察控制器和动作 4.1.1 IController与控制器基类 4.1.2 如何形成动作方法 4.2 哪些应该放在动作方法中 4.2.1 手动映射视图模型 4.2.2 输入验证 ...
- RFS的web自动化验收测试——第14讲 万能的evaluate
引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面. ( @齐涛-道长 新浪微博) 这一讲我们重点来介绍一下一个常用的关键字e ...
- Swift - final关键字的介绍,以及使用场景
final关键字在大多数的编程语言中都存在,表示不允许对其修饰的内容进行继承或者重新操作.Swift中,final关键字可以在class.func和var前修饰. 通常大家都认为使用final可以更好 ...
- git-daemon的快捷搭建
使用git-daemon进行git服务器搭建 1.安装git-daemon 前提是已经安装git sudo apt-get install git git-core 然后安装git-daemon su ...
- MFC画二维动态图表[GDI]
源博客:http://www.codeproject.com/Articles/9350/2D-Animated-Charts 源代码:http://download.csdn.net/detail/ ...
- [Java Performance] 数据库性能最佳实践 - JPA缓存
JPA缓存(JPA Caching) JPA有两种类型的缓存: EntityManager自身就是一种缓存.事务中从数据库获取的和写入到数据库的数据会被缓存(什么样的数据会被缓存.在后面有介绍).在一 ...