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 ...
随机推荐
- structure and interpretation of Computer programs -- Foreword
Foreword 前言 Educators, generals, dieticians, psychologists, and parents program. Armies, students ...
- awk 的逻辑运算字符
既然有需要用到 "条件" 的类别,自然就需要一些逻辑运算啰-例如底下这些:运算单元代表意义> 大于小于>= 大于或等于小于或等于== 等于!= 不等于值得注意的是那个 ...
- Android圆形图片自定义控件
Android圆形图片控件效果图如下: 代码如下: RoundImageView.java package com.dxd.roundimageview; import android.content ...
- 基于visual Studio2013解决C语言竞赛题之0805成绩输出
题目
- 用overflow-y 解决web页面抖动问题
页面抖动(左右抖动)让人视觉上很不爽.. /** original : php攻城师 http://blog.csdn.net/phpgcs **/ 最开始我也以为是 layout 不一致的原因..后 ...
- Linux中处理需要传输的IP报文流程
本文主要讲解了Linux中处理需要传输的IP报文流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linux中处理需要传输的IP报文流程进行了讲解,希望可以对 ...
- poj 3767 I Wanna Go Home
题意:n个点(从1-n编号) m条边 下面m行 u v dis 表示双向边u v的距离 n个点表示 每个点被势力1或2占据 这里保证1 城市由势力1占据,2城市由势力2占据 思路: 求2遍spfa() ...
- ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables opt
mysql跳过权限: mysqld -nt --skip-grant-tables opt 登录:mysql -uroot -p 修改root密码 set password for 'root'@'l ...
- Java设计模式菜鸟系列(七)命令模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39804057 命令模式(Command):将"请求"(命令/口令)封装 ...
- perl学习(8) 控制:unless,until,next,redo,last
Perl中实现了所有C 的操作符! Perl力求代码最少! 1.1.unless unless的含义是:除非条件为真,否则执行块中的代码,和if正好相反 unless($fred=~ /^[A-Z_] ...