JAVA I/O流 (三)--一个创建和解压缩zip文件的小工具类Zip
2014-04-18 14:17
288 查看
通过这个类可以直接操作里面的compress和Decompress静态方法来压缩和解压缩文件。不多说了,直接上代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class Zip{
public static final String EXT = ".zip";
private static final String BASE_DIR = "";
// 符号"/"用来作为目录标识判断符
private static final String PATH = "/";
private static final int BUFFER = 2048;
public static void compress(String fileName) throws Exception{
//fileName为指定路径下的待压缩文件
File srcFile=new File(fileName);
String currentPath=srcFile.getPath();
String destPath= currentPath +EXT;
File destFile=new File(destPath);
//采用最常见的CRC32进行解压
CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(
destFile), new CRC32());
ZipOutputStream zos = new ZipOutputStream(cos);
compress(srcFile, zos, BASE_DIR);
zos.flush();
zos.close();
}
private static void compress(File srcFile, ZipOutputStream zos,
String basePath) throws Exception {
if (srcFile.isDirectory()) {
compressDir(srcFile, zos, basePath);
} else {
compressFile(srcFile, zos, basePath);
}
}
private static void compressDir(File dir, ZipOutputStream zos,
String basePath) throws Exception {
//列出目录下的所有子目录,这些子目录可能是文件也可能仍旧是目录,采用递归方式压缩
File[] files = dir.listFiles();
// 构建空目录
if (files.length < 1) {
ZipEntry entry = new ZipEntry(basePath + dir.getName() + PATH);
zos.putNextEntry(entry);
zos.closeEntry();
}
for (File file : files) {
// 递归压缩
compress(file, zos, basePath + dir.getName() + PATH);
}
}
//file为待压缩文件,dir为压缩文件中的当前路径
private static void compressFile(File file, ZipOutputStream zos, String dir)
throws Exception {
//entry为待压缩条目
ZipEntry entry = new ZipEntry(dir + file.getName());
zos.putNextEntry(entry);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
file));
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count);
}
bis.close();
zos.closeEntry();
}
//以下实现代码解压缩
public static void Decompress(String srcPath) throws Exception{
File srcFile=new File(srcPath);
String basePath = srcFile.getParent();
File destFile=new File(basePath);
CheckedInputStream cis = new CheckedInputStream(new FileInputStream(
srcFile), new CRC32());
ZipInputStream zis = new ZipInputStream(cis);
Decompress(destFile, zis);
zis.close();
}
private static void Decompress(File destFile, ZipInputStream zis) throws Exception {
ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) {
// 文件
String dir = destFile.getPath() + File.separator + entry.getName();
File dirFile = new File(dir);
fileProber(dirFile);
if (entry.isDirectory()){
dirFile.mkdirs();
}else{
DecompressFile(dirFile, zis);
}
}
}
//当父目录不存在时候,创建目录
private static void fileProber(File dirFile) {
File parentFile = dirFile.getParentFile();
if(!parentFile.exists()){
fileProber(parentFile);
parentFile.mkdir();
}
}
private static void DecompressFile(File destFile, ZipInputStream zis) throws Exception {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
int count;
byte data[] = new byte[BUFFER];
while ((count = zis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bos.close();
}
}
假设D盘下面有一个zhengZe目录,zhengZe目录下面有一个TextFile.txt文件。我们通过以下方式分别对目录和文件进行压缩:
Zip.compress("d:\\zhengZe");//对目录进行压缩
Zip.compress("d:\\zhengZe\\TextFile.txt");//对文件进行压缩
然后我们队创建的压缩文件进行解压,通过以下方式进行解压即可:
Zip.Decompress("d:\\zhengZe.zip");
Zip.Decompress("d:\\zhengZe\\TextFile.txt.zip");
由于这个压缩和解压缩方法都是静态方法,我们不用创建类实例,通过类调用就可操作。这也符合我们实际情况。这段代码的可用性比较好,能够解决常见的压缩和解压缩问题。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class Zip{
public static final String EXT = ".zip";
private static final String BASE_DIR = "";
// 符号"/"用来作为目录标识判断符
private static final String PATH = "/";
private static final int BUFFER = 2048;
public static void compress(String fileName) throws Exception{
//fileName为指定路径下的待压缩文件
File srcFile=new File(fileName);
String currentPath=srcFile.getPath();
String destPath= currentPath +EXT;
File destFile=new File(destPath);
//采用最常见的CRC32进行解压
CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(
destFile), new CRC32());
ZipOutputStream zos = new ZipOutputStream(cos);
compress(srcFile, zos, BASE_DIR);
zos.flush();
zos.close();
}
private static void compress(File srcFile, ZipOutputStream zos,
String basePath) throws Exception {
if (srcFile.isDirectory()) {
compressDir(srcFile, zos, basePath);
} else {
compressFile(srcFile, zos, basePath);
}
}
private static void compressDir(File dir, ZipOutputStream zos,
String basePath) throws Exception {
//列出目录下的所有子目录,这些子目录可能是文件也可能仍旧是目录,采用递归方式压缩
File[] files = dir.listFiles();
// 构建空目录
if (files.length < 1) {
ZipEntry entry = new ZipEntry(basePath + dir.getName() + PATH);
zos.putNextEntry(entry);
zos.closeEntry();
}
for (File file : files) {
// 递归压缩
compress(file, zos, basePath + dir.getName() + PATH);
}
}
//file为待压缩文件,dir为压缩文件中的当前路径
private static void compressFile(File file, ZipOutputStream zos, String dir)
throws Exception {
//entry为待压缩条目
ZipEntry entry = new ZipEntry(dir + file.getName());
zos.putNextEntry(entry);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
file));
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count);
}
bis.close();
zos.closeEntry();
}
//以下实现代码解压缩
public static void Decompress(String srcPath) throws Exception{
File srcFile=new File(srcPath);
String basePath = srcFile.getParent();
File destFile=new File(basePath);
CheckedInputStream cis = new CheckedInputStream(new FileInputStream(
srcFile), new CRC32());
ZipInputStream zis = new ZipInputStream(cis);
Decompress(destFile, zis);
zis.close();
}
private static void Decompress(File destFile, ZipInputStream zis) throws Exception {
ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) {
// 文件
String dir = destFile.getPath() + File.separator + entry.getName();
File dirFile = new File(dir);
fileProber(dirFile);
if (entry.isDirectory()){
dirFile.mkdirs();
}else{
DecompressFile(dirFile, zis);
}
}
}
//当父目录不存在时候,创建目录
private static void fileProber(File dirFile) {
File parentFile = dirFile.getParentFile();
if(!parentFile.exists()){
fileProber(parentFile);
parentFile.mkdir();
}
}
private static void DecompressFile(File destFile, ZipInputStream zis) throws Exception {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
int count;
byte data[] = new byte[BUFFER];
while ((count = zis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bos.close();
}
}
假设D盘下面有一个zhengZe目录,zhengZe目录下面有一个TextFile.txt文件。我们通过以下方式分别对目录和文件进行压缩:
Zip.compress("d:\\zhengZe");//对目录进行压缩
Zip.compress("d:\\zhengZe\\TextFile.txt");//对文件进行压缩
然后我们队创建的压缩文件进行解压,通过以下方式进行解压即可:
Zip.Decompress("d:\\zhengZe.zip");
Zip.Decompress("d:\\zhengZe\\TextFile.txt.zip");
由于这个压缩和解压缩方法都是静态方法,我们不用创建类实例,通过类调用就可操作。这也符合我们实际情况。这段代码的可用性比较好,能够解决常见的压缩和解压缩问题。
相关文章推荐
- 一个用java.util.zip创建和读取zip文件的类,可以操作目录
- C#文件的压缩和解压(ZIP)使用DotNetZip封装类操作zip文件(创建/读取/更新)实例
- 将一个字符串按照zip方式压缩和解压缩
- 使用ant实现Zip文件压缩和解压缩Zip文件
- java将文件打包成ZIP压缩文件的工具类实例
- java压缩和解压缩Zip、Jar、Gzip文件
- 压缩工具类 - ZipUtils.java
- php简单创建zip压缩文件的方法
- vc zip压缩和解压缩
- Linux 备份mysql 和解压缩文件(zip)
- java压缩和解压缩Zip、Jar、Gzip文件
- Java创建ZIP压缩文件
- php创建zip压缩文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java zip API实现压缩和解压缩zip包
- Python压缩解压缩zip文件及破解zip文件密码的方法
- java写的zip压缩和解压缩程序
- java解压缩zip文件,java创建zip文件,java压缩文件,java解压文件,用到ant.jar解决汉字乱码
- java压缩和解压缩Zip、Jar、Gzip文件
- 使用java.util.zip对字符串进行压缩和解压缩