您的位置:首页 > 编程语言 > Java开发

Java案例:压缩与解压缩文件

2018-02-18 21:29 316 查看
1、任务(1)将单个文件压缩成一个zip文件(2)将整个目录压缩成一个zip文件(3)将zip压缩文件解压缩到指定目录
2、知识点(1)ZipInputStream,ZipOutputStream(2)ZipFile(3)ZipEntry(4)File,FileInputStream,FileOutputStream(5)Enumeration(6)ArrayList
3、Java代码
/**
* 功能:演示ZipInputStream与ZipOutputStream用法
*           创建压缩文件(单个文件,整个目录)
*           解压缩文件到指定目录
* 作者:华卫
* 日期:2015年5月27日
*/
package net.hw.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipStreamDemo {

public static void main(String[] args) {

/**
* 测试createZipFromFile方法
*/
String strSrcFileName = "d:/love.txt";
String strZipFileName = "d:/love.zip";

File srcFile = new File(strSrcFileName); // 源文件
File zipFile = new File(strZipFileName); // 目标文件
createZipFromFile(srcFile, zipFile); // 创建压缩文件

System.out.println("==单个文件压缩==\n");
System.out.println("源文件:" + srcFile.getPath());
System.out.println("压缩文件:" + zipFile.getPath() + "\n");

/**
* 测试createZipFromDir方法
*/
String strSrcDir = "d:/data";
strZipFileName = "d:/data.zip";

File srcDir = new File(strSrcDir); // 源目录
zipFile = new File(strZipFileName); // 目标文件

System.out.println("==整个目录压缩成文件==\n");
System.out.println("源目录:" + srcDir.getPath() + "\n");
createZipFromDir(srcDir, zipFile); // 创建压缩文件
System.out.println("\n压缩文件:" + zipFile.getPath() + "\n");

/**
* 测试extractZipToFiles方法
*/
System.out.println("==解压缩文件==\n");
srcFile = new File("d:/lzy.zip"); // 源文件
File extractDir = new File("d:/hw_file"); // 解压缩目录
extractDir.mkdir(); // 创建目录
List<String> file_list = extractZipToFiles(srcFile, extractDir); // 解压缩文件,获得文件名列表

System.out.println("压缩文件:" + srcFile.getPath());
System.out.println("解压缩目录:" + extractDir.getPath() + "\n");
// 输出解压缩文件名列表
for (String file : file_list) {
System.out.println("解压缩文件:" + file);
}
}

/**
* 由单个文件创建压缩文件
*
* @param srcFile  源文件
* @param zipFile  目标文件
*/
public static void createZipFromFile(File srcFile, File zipFile) {

try {
// 创建ZipOutputStream对象
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
zipFile));

// 创建ZipEntry对象,设置相关属性
ZipEntry entry = new ZipEntry(srcFile.getName());
entry.setSize(srcFile.length());
entry.setTime(srcFile.lastModified());

// 将entry加入zos
zos.putNextEntry(entry);

// 将srcFile文件内容写入zipFile
FileInputStream fis = new FileInputStream(srcFile);
int length = fis.available();
byte[] buffer = new byte[length];
zos.write(buffer);

// 关闭流
fis.close();
zos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 将整个目录压缩成文件
*
* @param srcDir   源目录
* @param zipFile  压缩文件
*/
public static void createZipFromDir(File srcDir, File zipFile) {
try {
// 创建ZipOutputStream对象
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
zipFile));

// 获得源目录下的文件列表
ArrayList<String> file_list = new ArrayList<String>();
list(srcDir, file_list);

for (String file_name : file_list) {
System.out.println(file_name);
File srcFile = new File(file_name);
// 创建ZipEntry对象,设置相关属性
ZipEntry entry = new ZipEntry(srcFile.getPath().substring(
srcDir.getName().length() - 1));
entry.setSize(srcFile.length());
entry.setTime(srcFile.lastModified());

// 将entry加入zos
zos.putNextEntry(entry);

// 将srcFile文件内容写入zipFile
FileInputStream fis = new FileInputStream(srcFile);
int length = fis.available();
byte[] buffer = new byte[length];
zos.write(buffer);

// 关闭流
fis.close();
}

zos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

/**
* 获取指定目录下所有文件(包含子目录)
*
* @param dir 指定目录
* @param file_list  文件名列表
*/
public static void list(File dir, ArrayList<String> file_list) {
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
file_list.add(files[i].getPath());
} else {
if (files[i].list() != null) {
list(files[i], file_list);
}
}
}
}

/**
* 解压缩文件到指定目录
*
* @param zipFile 压缩文件
* @param extractDir  解压缩目录
* @return 解压之后的文件名列表
*/
public static List<String> extractZipToFiles(File srcFile, File extractDir) {
List<String> file_list = new ArrayList<String>();
try {
// 创建压缩文件对象
ZipFile zipFile = new ZipFile(srcFile);
// 获得压缩文件的entry列表
Enumeration entry_list = zipFile.entries();
ZipEntry entry = null;

// 遍历压缩文件的entry列表
while (entry_list.hasMoreElements()) {
entry = (ZipEntry) entry_list.nextElement();
if (entry.isDirectory()) { // 略过目录
continue;
}

// 目标文件全名
String objFileFullName = extractDir.getPath() + "/"
+ entry.getName();

// 目标文件的目录
String strDir = objFileFullName.substring(0,
objFileFullName.lastIndexOf('/'));
// 目标文件的文件名
String strFileName = objFileFullName.substring(objFileFullName
.lastIndexOf('/') + 1);

// 创建目标文件所在的目录
File dir = new File(strDir);
dir.mkdir();

// 创建目标文件名
File objFile = new File(dir, strFileName);

// 创建文件字节输出流
FileOutputStream fos = new FileOutputStream(objFile);
// 通过压缩条目获得输入流
InputStream in = zipFile.getInputStream(entry);
// 写入目标文件
int length = in.available();
byte[] buffer = new byte[length];
fos.write(buffer);
fos.flush();
// 目标文件全名添加入文件列表
file_list.add(objFile.getAbsolutePath());
}

zipFile.close();
} catch (ZipException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return file_list;
}

}

3、运行结果
==单个文件压缩==
源文件:d:\love.txt压缩文件:d:\love.zip
==整个目录压缩成文件==
源目录:d:\data
d:\data\abc1.prgd:\data\abc2.prgd:\data\course.CDXd:\data\example2_41.PRGd:\data\java\HelloMobile.classd:\data\java\HelloMobile.javad:\data\java\HelloWorld.classd:\data\java\HelloWorld.java
压缩文件:d:\data.zip
==解压缩文件==
压缩文件:d:\lzy.zip解压缩目录:d:\hw_file
解压缩文件:d:\hw_file\hw\bird.txt解压缩文件:d:\hw_file\hw\css\hate.css解压缩文件:d:\hw_file\hw\css\index.css解压缩文件:d:\hw_file\hw\css\love.css解压缩文件:d:\hw_file\hw\jsp\hate.jsp解压缩文件:d:\hw_file\hw\jsp\index.jsp解压缩文件:d:\hw_file\hw\jsp\love.jsp解压缩文件:d:\hw_file\hw\love.txt 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: