/**
* 创建ZIP文件
* @param sourcePath 文件或文件夹路径
* @param zipPath 生成的zip文件存在路径(包括文件名)
*/
public static void zip(String sourcePath,String targetPath){
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
//创建压缩文件输出流
fos = new FileOutputStream(targetPath);
//创建压缩文件压缩流
zos = new ZipOutputStream(fos);
//压缩处理
writeZip(new File(sourcePath),"",zos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(zos != null){
//flush的作用是强制将缓冲区里的东西立刻执行(立刻写到输出流中去),然后清空,不管里面有多少东西
zos.flush();
zos.close();
}
if(fos != null){
fos.flush();
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//压缩处理
public static void writeZip(File file,String parentPath,ZipOutputStream zos){
if(file.exists()){
if(file.isDirectory()){
/*file.separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
*separatorChar:与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。
*在 UNIX 系统上,此字段的值为 ‘/’;在 Microsoft Windows 系统上,它为 ‘\’。 */
parentPath += file.getName()+File.separator;
File[] files = file.listFiles();
for(File f : files){
writeZip(f,parentPath,zos);
}
}else{
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
//创建一个zipEntry对象
ZipEntry ze = new ZipEntry(parentPath+file.getName());
//将ZipEntry加到zos中,再写入实际的文件内容
zos.putNextEntry(ze);
//添加编码,如果不添加,当文件以中文命名的情况下,会出现乱码
//ZipOutputStream的包一定是apache的ant.jar包。JDK也提供了打压缩包,但是不能设置编码
zos.setEncoding("GBK");
//设置缓冲区的大小
byte[] content = new byte[1024];
int len; //表示成功读取的字节数的个数
//fis.read(content)将filepath的文件放入contetn作为内存缓冲区并获得可读的长度len
//FileInputStream可以使用read(byte[] b )每次读取多个(b.length)字节数据(每次最多读取多少个)到byte数组当中
while((len=fis.read(content))!=-1){
/*然后write(content,0,len)写到OutputStream中,
* 每次都是从content内存处的0偏移开始写,每次写len字节*/
zos.write(content,0,len);
}
zos.flush();
zos.closeEntry();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
* 创建ZIP文件
* @param sourcePath 文件或文件夹路径
* @param zipPath 生成的zip文件存在路径(包括文件名)
*/
public static void zip(String sourcePath,String targetPath){
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
//创建压缩文件输出流
fos = new FileOutputStream(targetPath);
//创建压缩文件压缩流
zos = new ZipOutputStream(fos);
//压缩处理
writeZip(new File(sourcePath),"",zos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(zos != null){
//flush的作用是强制将缓冲区里的东西立刻执行(立刻写到输出流中去),然后清空,不管里面有多少东西
zos.flush();
zos.close();
}
if(fos != null){
fos.flush();
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//压缩处理
public static void writeZip(File file,String parentPath,ZipOutputStream zos){
if(file.exists()){
if(file.isDirectory()){
/*file.separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
*separatorChar:与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。
*在 UNIX 系统上,此字段的值为 ‘/’;在 Microsoft Windows 系统上,它为 ‘\’。 */
parentPath += file.getName()+File.separator;
File[] files = file.listFiles();
for(File f : files){
writeZip(f,parentPath,zos);
}
}else{
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
//创建一个zipEntry对象
ZipEntry ze = new ZipEntry(parentPath+file.getName());
//将ZipEntry加到zos中,再写入实际的文件内容
zos.putNextEntry(ze);
//添加编码,如果不添加,当文件以中文命名的情况下,会出现乱码
//ZipOutputStream的包一定是apache的ant.jar包。JDK也提供了打压缩包,但是不能设置编码
zos.setEncoding("GBK");
//设置缓冲区的大小
byte[] content = new byte[1024];
int len; //表示成功读取的字节数的个数
//fis.read(content)将filepath的文件放入contetn作为内存缓冲区并获得可读的长度len
//FileInputStream可以使用read(byte[] b )每次读取多个(b.length)字节数据(每次最多读取多少个)到byte数组当中
while((len=fis.read(content))!=-1){
/*然后write(content,0,len)写到OutputStream中,
* 每次都是从content内存处的0偏移开始写,每次写len字节*/
zos.write(content,0,len);
}
zos.flush();
zos.closeEntry();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}