Java中通过ZipOutputStream和ZipInputStream实现对一个或多个文件的压缩与解压。压缩时文件时,创建zip输出流,并在流中添加zip条目,用流把文件的内容写入压缩文件中。解压时,创建zip输入流,并分别创建文件夹和zip条目对应的文件,再用流把zip条目中的内容写入个文件中。以下分别展示了如何对一个文件和多个文件实现压缩与解压。
一个文件的压缩与解压
压缩:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/*
* 需求:将E盘下的zipTest1.txt文件 压缩成 zipTest1.zip文件
* 分析:
* 1.利用ZipOutputStream 中的write方法压缩文件。
* 2.压缩时,文件被压缩成了zip文件中对应的ZipEntry(zip条目),
* zip条目的名字需要设置。
* 实现:
* 1.根据原文件名获取相应的压缩文件和zip条目的名字;
* 2.创建文件输入流,读入原文件;创建zip输出流,压缩文件;
* 3.创建zip条目,并将其添加至zip输出流中;
* 4.调用write方法,将原文件的内容写入至zip条目中;
* 5.关闭zip条目,关闭相关流。
*/
public class ZipOutTest1 {
public static void main(String[] args) {
String name = "E:\\zipTest1.txt"; //原文件路径
try {
zipOut(name);
} catch (IOException e) {
System.out.println("压缩文件时出错!");
}
}
private static void zipOut(String name) throws IOException {
// 根据原文件名得到zip格式的文件名
String zipName = name.substring(0, name.indexOf("."))
+ ".zip";
// 根据原文件名得到zip条目的名称,即文件在压缩文件中的名字
String zeName = name.substring(name.indexOf("\\")+1);
// 创建文件输入流 、 文件输出流、 zip输出流
FileInputStream fis = new FileInputStream(name);
FileOutputStream fos = new FileOutputStream(zipName);
ZipOutputStream zos = new ZipOutputStream(fos);
// 创建zip条目,并将其添加至zip输出流中
ZipEntry ze = new ZipEntry(zeName);
zos.putNextEntry(ze);
// 压缩文件
byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1) {
zos.write(buf,0,len);
zos.closeEntry();
}
// 关闭流,只有在关闭流后,文件内容才能写入成功
zos.close();
fis.close();
}
}
解压:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/*
* 需求:将E盘下的zipTest1.zip文件 进行解压。
* 分析:
* 1.解压文件用 Zip输入流 读入文件内容后用 文件输出流 输出文件。
* 2.要根据压缩文件名和zip条目名获取解压后文件的名字。
* 实现:
* 1.创建zip输入流;
* 2.创建zip条目;
* 3.解压文件按过程中,获取解压后文件的名字后将文件内容输出;
* 4.关闭zip条目和相关流。
*/
public class ZipInTest1 {
public static void main(String[] args) {
String zipName = "E:\\zipTest1.zip";// 压缩文件名
try {
zipIn(zipName);
} catch (IOException e) {
System.out.println("解压文件时出错!");
}
}
private static void zipIn(String zipName)
throws IOException {
// 创建zip输入流
FileInputStream fis = new FileInputStream(zipName);
ZipInputStream zis = new ZipInputStream(fis);
FileOutputStream fos = null;
// 创建zip条目
ZipEntry ze;
// 解压文件
while ((ze = zis.getNextEntry()) != null) {
// 根据压缩文件名和zip条目的名字获取解压后文件的名字
String fileName =
zipName.substring(0, zipName.indexOf("\\") + 1)
+ ze.getName();
// 创建文件输出流
fos = new FileOutputStream(fileName);
byte[] buf = new byte[1024];
int len;
while ((len = zis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
zis.closeEntry();
}
zis.close();
if (fos != null)
fos.close();
}
}
// 其实以上代码也可以实现压缩文件中的多个文件的解压,
// 只不过解压后的文件不在一个文件夹内。
多个文件的压缩与解压
压缩:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/*
* 将zipTest文件夹内的多个文件压缩成zip文件
* 分别为每个文件创建对应的zip条目,并将内容写入
*/
public class ZipOutTest2 {
public static void main(String[] args) {
File srcFile = new File("E:\\zipTest");//原文件所在文件夹
File destFile = new File("E:\\zipTest.zip");// 压缩后的文件
try {
zipOut(srcFile, destFile);
} catch (IOException e) {
System.out.println("压缩文件时出错!");
}
}
private static void zipOut(File file, File dest) throws IOException {
// 创建文件输入流 和 zip输出流
FileInputStream fis = null;
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream(dest));
// 获取文件夹内所以File对象,并将各文件逐一压缩
File[] files = file.listFiles();
for (File f : files) {
fis = new FileInputStream(f);// 读入单个文件
// 为每个文件添加zip条目
zos.putNextEntry(new ZipEntry(f.getName()));
// 将各文件压缩
byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
}
zos.close();
if (fis != null)
fis.close();
}
}
解压:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/*
* 对压缩文件中的多个文件解压至指定的文件夹内
* 利用循环分别为每个zip条目创建对应的文件,并用流写入内容
*/
public class ZipInTest2 {
public static void main(String[] args) {
File srcFile = new File("E:\\zipTest.zip");
File destFile = new File("E:\\zipTest");
try {
zipIn(srcFile, destFile);
} catch (IOException e) {
System.out.println("解压文件时出错!");
}
}
private static void zipIn(File srcFile, File destFile) throws IOException {
// 创建zip输入流
ZipInputStream zis = new ZipInputStream(new FileInputStream(srcFile));
FileOutputStream fos = null;
// 解压文件
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
// 创建目标文件夹和目标文件,方便后面将内容写入这些文件
// 压缩文件中各条目的File对象
File file = new File(destFile, ze.getName());
destFile.mkdirs(); // 创建文件夹
file.createNewFile(); // 创建文件
// 为各zip条目创建输出流
fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while ((len = zis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
zis.closeEntry();// 关闭zip条目
}
if (fos != null)
fos.close();
zis.close();
}
}