ZIP压缩管理文件(ZIP archive)是一种十分典型的文件压缩形式。关于ZIP压缩的I/O实现,在Java的内置类中提供了非常好用的相关类,所以其实现方式非常简单。
本文将介绍 java.util.zip包中的ZipOutputStream与ZipInputStream类来实现文件的压缩/解压缩。
1. 压缩文件
利用ZipOutputStream类对象,可将文件压缩为.zip文件。ZipOutputStream类的构造方法如下:
ZipOutputStream(OutputStream out);
ZipOutputStream类的常用方法如下表所示:
方法 | 返回值 | 说明 |
---|---|---|
putNextEntry(ZipEntry e) | void | 开始写一个新的ZipEntry,并将流内的位置移至此entry所指数据的开头 |
write(byte[] b, int off, int len) | void | 将字节数组写入当前ZIP条目数据 |
finish() | void | 完成写入ZIP输出流的内容,无须关闭它所配合的OutputStream |
setComment(String comment) | void | 可设置此ZIP文件的注释文字 |
下面的实例为压缩E盘的hello 文件夹,在该文件夹中有hello1.txt和hello2.txt文件,并将压缩后的hello.zip文件夹保存在E盘根目录下。
public class MyZip{
private void zip(String zipFileName, File inputFile) throws Exception{
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
zip(out, inputFile,"");
System.out.println("压缩中...");
out.close()
}
private void zip(ZipOutputStream out, File f, String base) throws Exception{
if(f.isDirectory()){
File[] f1 = f.listFiles();
if(base.length() !=0){
out.putNextEntry(new ZipEntry(base + "/"));
}
for(int i = 0;i<f1.length;i++){
zip(out,f1[i],base + f1[i]);
}
}else{
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
System.out.println(base);
while((b=in.read()) != -1){
out.write(b);
}
in.close();
}
}
public static void main(String[] temp){
MyZip book = new MyZip();
try{
book.zip("E:/hello.zip",new File("E:/hello"))
System.out.println("压缩完成");
} catch(Exception e){
e.printStackTrace();
}
}
}
2. 解压缩ZIP文件
ZipInputStream类可读取Zip压缩格式的文件,包括已压缩和未压缩的条目(entry)。ZipInputStream类的构造方法如下:
ZipInputStream(InputStream in)
ZipInputStream类的常用方法如表所示:
方法 | 返回值 | 说明 |
---|---|---|
read(byte[] b, int off, int len) | int | 读取目标b数组内off偏移量的位置,长度是len字节 |
available() | int | 判断是否已读完目前entry所指定的数据。已读完返回0,否则返回1 |
closeEntry() | void | 关闭当前ZIP条目并定位流以读取下一个条目 |
skip(long n) | long | 跳过当前ZIP条目中指定的字节数 |
getNextEntry() | ZipEntry | 读取下一个ZipEntry,并将流内的位置移至该entry所指数据的开头 |
createZipEntry(String name) | ZipEntry | 以指定的name参数新建一个ZipEntry对象 |
下面实例时将压缩后的文件hello.zip进行解压,解压后的文件存储在ZipEntry类的getName()方法获取的目录下。
public class Decompressing{
public static void main(String[] temp){
File file = new File("hello.zip");
ZipInputStream zin;
try{
ZipFile zipFile = new ZipFile(file);
zin = new ZipInputStream(new FileinputStream(file));
ZipEntry entry = zin.getNextEntry();
while(((entry = zin.getNextEntry())!= null) && !entry.isDirectory()){
File tmp = new File("C:\\" + entry.getName());
if(!temp.exists()){
temp.getParentFile().mkdirs();
OutputStream os = new FileOutputStream(tmp);
InputStream in = zipFile.getInputStream(entry);
int count = 0;
while((count = in.read())!= -1){
os.write(count);
}
os.close();
in.close();
}
zin.closeEntry();
System.out.println(entry.getName() + "解压成功");
}
zin.close();
}catch(Exception e){
e.printStackTrace();
}
}
}