文件压缩与解压缩-爱代码爱编程
在Java中,文件的压缩与解压缩,主要依赖三个类来完成,ZipInputStream、ZipOutputStream、ZipEntry。
使用java来压缩文件,准备好被压缩的文件。
Java实现压缩文件,直接上代码
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipFile {
public static void main(String[] args) throws IOException {
ZipFile zipFile = new ZipFile();
List<File> fileList = new ArrayList<File>();
fileList.add(new File("1.txt"));
fileList.add(new File("2.txt"));
zipFile.zip(fileList,new File("my.zip"));
}
/**
* 压缩文件
* @param fileList 待压缩的文件
* @param destFile 目标压缩包文件
*/
public void zip(List<File> fileList, File destFile) throws IOException {
if(fileList==null||fileList.isEmpty()){
return;
}
OutputStream out = new FileOutputStream(destFile);
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(out));
//设置压缩等级,范围0-9 压缩等级越高,压缩体积越小,压缩时间越长
zipOutputStream.setLevel(5);
for (File file : fileList){
//zip文件条目
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = 0;
while((len=fileInputStream.read(bytes))!=-1){
zipOutputStream.write(bytes,0,len);
}
zipOutputStream.closeEntry();
fileInputStream.close();
}
zipOutputStream.close();
}
}
运行效果,效果如下图
现在Java来实现解压文件,代码如下
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipFile {
public static void main(String[] args) throws IOException {
ZipFile zipFile = new ZipFile();
// List<File> fileList = new ArrayList<File>();
// fileList.add(new File("1.txt"));
// fileList.add(new File("2.txt"));
// zipFile.zip(fileList,new File("my.zip"));
zipFile.unzip(new File("my.zip"),new File("./test"));
}
/**
* 压缩文件
* @param fileList 待压缩的文件
* @param destFile 目标压缩包文件
*/
public void zip(List<File> fileList, File destFile) throws IOException {
if(fileList==null||fileList.isEmpty()){
return;
}
OutputStream out = new FileOutputStream(destFile);
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(out));
//设置压缩等级,范围0-9 压缩等级越高,压缩体积越小,压缩时间越长
zipOutputStream.setLevel(5);
for (File file : fileList){
//zip文件条目
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(zipEntry);
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = 0;
while((len=fileInputStream.read(bytes))!=-1){
zipOutputStream.write(bytes,0,len);
}
zipOutputStream.closeEntry();
fileInputStream.close();
}
zipOutputStream.close();
}
}
/**
* 解压缩包
* @param zipFile 源压缩文件
* @param destFile 压缩目录
*/
public void unzip(File zipFile,File destFile) throws IOException {
if(zipFile == null)return;
if (destFile.isFile())return;
//destFile目录不存在,创建该目录
if(!destFile.exists()){
destFile.mkdirs();
}
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFile));
ZipEntry zipEntry;
while ((zipEntry=zipInputStream.getNextEntry())!=null){
String name = zipEntry.getName();
File file = new File(destFile,name);
if(zipEntry.isDirectory()){
file.mkdirs();
continue;
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
int len = 0;
byte[] bytes = new byte[1024];
while ((len=zipInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,len);
}
zipInputStream.closeEntry();
fileOutputStream.close();
}
zipInputStream.close();
}
运行效果,如下图
上面的代码,只能压缩文件,不能压缩文件目录。现在我们进行改进。
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipFile {
public static void main(String[] args) throws IOException {
ZipFile zipFile = new ZipFile();
List<File> fileList = new ArrayList<File>();
fileList.add(new File("1.txt"));
fileList.add(new File("2.txt"));
fileList.add(new File("test"));
zipFile.zip(fileList,new File("myDir.zip"));
// zipFile.unzip(new File("my.zip"),new File("./test"));
}
/**
* 压缩文件
* @param fileList 待压缩的文件
* @param destFile 目标压缩包文件
*/
public void zip(List<File> fileList, File destFile) throws IOException {
if(fileList==null||fileList.isEmpty()){
return;
}
OutputStream out = new FileOutputStream(destFile);
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(out));
//设置压缩等级,范围0-9 压缩等级越高,压缩体积越小,压缩时间越长
zipOutputStream.setLevel(5);
for (File file : fileList){
compress(file,zipOutputStream);
//zip文件条目
// ZipEntry zipEntry = new ZipEntry(file.getName());
// zipOutputStream.putNextEntry(zipEntry);
// FileInputStream fileInputStream = new FileInputStream(file);
// byte[] bytes = new byte[1024];
// int len = 0;
// while((len=fileInputStream.read(bytes))!=-1){
// zipOutputStream.write(bytes,0,len);
// }
// zipOutputStream.closeEntry();
// fileInputStream.close();
}
zipOutputStream.close();
}
private void compress(File file, ZipOutputStream zipOutputStream) throws IOException {
if (file.isFile()){
compressFile(file,file.getName(),zipOutputStream);
}else{
compressDir(file,file.getName(),zipOutputStream);
}
}
/**
* 压缩文件夹
* @param file 文件夹对象
* @param name 文件夹名称
* @param zipOutputStream zip流
*/
private void compressDir(File file, String name, ZipOutputStream zipOutputStream) throws IOException {
if(file.isDirectory()){
File[] files = file.listFiles();
zipOutputStream.putNextEntry(new ZipEntry(name+"/"));
zipOutputStream.closeEntry();
if(files!=null){
for(File f:files){
if(f.isFile()){
compressFile(f,name+"/"+f.getName(),zipOutputStream);
}else {
compressDir(f,name+"/"+f.getName(),zipOutputStream);
}
}
}
}
}
/**
* 压缩文件类型
* @param file 文件对象
* @param name 文件名称
* @param zipOutputStream zip流
*/
private void compressFile(File file, String name, ZipOutputStream zipOutputStream) throws IOException {
//zip文件条目
ZipEntry zipEntry = new ZipEntry(name);
zipOutputStream.putNextEntry(zipEntry);
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = 0;
while((len=fileInputStream.read(bytes))!=-1){
zipOutputStream.write(bytes,0,len);
}
zipOutputStream.closeEntry();
fileInputStream.close();
}
/**
* 解压缩包
* @param zipFile 源压缩文件
* @param destFile 压缩目录
*/
public void unzip(File zipFile,File destFile) throws IOException {
if(zipFile == null)return;
if (destFile.isFile())return;
//destFile目录不存在,创建该目录
if(!destFile.exists()){
destFile.mkdirs();
}
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFile));
ZipEntry zipEntry;
while ((zipEntry=zipInputStream.getNextEntry())!=null){
String name = zipEntry.getName();
File file = new File(destFile,name);
if(zipEntry.isDirectory()){
file.mkdirs();
continue;
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
int len = 0;
byte[] bytes = new byte[1024];
while ((len=zipInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,len);
}
zipInputStream.closeEntry();
fileOutputStream.close();
}
zipInputStream.close();
}
}