package testZip;
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.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipMultiDirectoryCompress {
public static String getFileModiefLast(File file){
Date d= new Date(file.lastModified());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date = df.format(d);
System.out.println("FileModieflast---"+date);
return date;
}
public static void main(String[] args) {
//初始化支持多级目录压缩的ZipMultiDirectoryCompress
ZipMultiDirectoryCompress zipCompress = new ZipMultiDirectoryCompress();
//压缩目录,可以指向一个文件
String directory = "D:\\workspace\\JMS\\WebRoot\\中文文件.txt";
//生成的压缩文件
String destFile = "D:\\workspace\\JMS\\WebRoot\\中文.zip";
//默认的相对地址,为根路径
String defaultParentPath = "";
ZipOutputStream zos = null;
try {
//创建一个Zip输出流
zos = new ZipOutputStream(new FileOutputStream(destFile));
//启动压缩进程
zipCompress.startCompress(zos,defaultParentPath,directory);
} catch (FileNotFoundException e){
e.printStackTrace();
} finally{
try {
if(zos != null)zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 开始压缩.
*
* @param zos ZipOutputStream
* @param oppositePath 相对路径,开始时相对路径为空
* @param directory 压缩目录,也可能是文件
*/
public void startCompress(ZipOutputStream zos, String oppositePath, String directory){
File file = new File(directory);
if(file.isDirectory()){
//如果是压缩目录
File[] files = file.listFiles();
for(int i=0;i<files.length;i++){
File aFile = files[i];
if(aFile.isDirectory()){
//如果是目录,修改相对地址
String newOppositePath = oppositePath + aFile.getName() + "/";
//创建目录
compressDirectory(zos, oppositePath, aFile);
//进行递归调用
startCompress(zos,newOppositePath,aFile.getPath());
} else {
//如果不是目录,则进行压缩
compressFile(zos,oppositePath,aFile);
}
}
} else {
//如果是压缩文件,直接调用压缩方法进行压缩
compressFile(zos,oppositePath,file);
}
}
/**
* 压缩文件.
*
* @param zos ZipOutputStream
* @param oppositePath 相对于路路径
* @param file 压缩的文件
*/
public void compressFile(ZipOutputStream zos, String oppositePath, File file){
//创建一个Zip条目,每个Zip条目都是必须相对于根路径
ZipEntry entry = new ZipEntry(oppositePath + file.getName());
InputStream is = null;
try{
//将条目保存到Zip压缩文件当中
zos.putNextEntry(entry);
//从文件输入流当中读取数据,并将数据写到输出流当中.
is = new FileInputStream(file);
int length = 0;
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
while((length=is.read(buffer,0,bufferSize))>=0){
zos.write(buffer, 0, length);
}
zos.closeEntry();
}catch(IOException ex){
ex.printStackTrace();
} finally {
try{
if(is != null)is.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
}
/**
* 在压缩文件当中创建一个新的压缩目录,支持空目录.
*
* @param zos
* @param oppositePath
* @param file
*/
public void compressDirectory(ZipOutputStream zos, String oppositePath, File file){
//压缩目录,这是关键,创建一个目录的条目时,需要在目录名后面加多一个"/"
ZipEntry entry = new ZipEntry(oppositePath + file.getName() + "/");
try {
zos.putNextEntry(entry);
zos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
}
java实现文件打包压缩处理
最新推荐文章于 2024-06-11 10:15:07 发布