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

Java中文件的压缩与解压

2016-01-11 11:56 483 查看
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();
}
}

// 其实以上代
4000
码也可以实现压缩文件中的多个文件的解压,
// 只不过解压后的文件不在一个文件夹内。


多个文件的压缩与解压

压缩:

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息