如果在Java要压缩一个文件夹及其所有子文件与子文件夹,可以利用到Apache公司提供的ant插件。其实也就是一个jar包。
比如,如果要把f:\bb下的所有文件,压缩成一个f:\bb.zip,如下图:
首先先到Apache的官网,下载ant插件,地址:http://ant.apache.org/bindownload.cgi(点击打开链接)
下载解压之后,取走其中的apache-ant-1.9.4\lib下的ant.jar放到你的java工程就行:
比如拷贝到你的java工程,目录结构如下图,在Eclipse右键你的java工程properties->java build path->add jars选择你刚才拷贝过来的ant.jar:
之后,首先在开头引入如下的包:
package zipTest;
import java.io.*;
import java.util.*;
import org.apache.tools.zip.*;
接着如《【Java】读取其下所有文件夹与文件的路径》( 点击打开链接)一样,先读取你要压缩的文件夹的所有文件路径,用一个ArrayList<String>存起来,然后如《【Java】ArrayList<String>转化为String数组问题》( 点击打开链接)将其转化成String数组
public static void main(String[] args) throws Exception {
//先读取f:/bb下的所有文件的路径
ArrayList<String> dirStrArr = new ArrayList<String>();
File dir = new File("f:/bb");
if (dir.exists()) {
File files[] = dir.listFiles();
for (File file : files) {
dirStrArr.add(dir.getPath() + "/" + file.getName());
}
}
//输出为f:/bb.zip,接着要求要求刚才读取到所有文件
compress(new FileOutputStream("f:/bb.zip"),
(String[]) dirStrArr.toArray(new String[0]));
}
再通过如下的Java方法,将其压缩:
//如果是文件夹,则循环递归这个方法,因为还要读取旗下的所有子文件夹与子文件。
private static void zipDirectory(ZipOutputStream zos, String dirName,
String basePath) throws Exception {
File dir = new File(dirName);
if (dir.exists()) {
File files[] = dir.listFiles();
if (files.length > 0) {
for (File file : files) {
//读取的时候同样分两种情况,文件、文件夹
if (file.isDirectory()) {
zipDirectory(
zos,
file.getPath(),
basePath
+ file.getName().substring(
file.getName().lastIndexOf(
File.separator) + 1)
+ File.separator);
} else
zipFile(zos, file.getPath(), basePath);
}
//如果是一个空文件夹
} else {
//直接压缩就可以了
ZipEntry ze = new ZipEntry(basePath);
zos.putNextEntry(ze);
}
}
}
private static void zipFile(ZipOutputStream zos, String filename,
String basePath) throws Exception {
//如果是文件,应该利用输入输出流,分段压缩
File file = new File(filename);
if (file.exists()) {
FileInputStream fis = new FileInputStream(filename);
ZipEntry ze = new ZipEntry(basePath + file.getName());
zos.putNextEntry(ze);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = fis.read(buffer)) > 0) {
zos.write(buffer, 0, count);
}
fis.close();
}
}
public static void compress(OutputStream os, String... paths)
throws Exception {
// 指定输出的地方就是传过来的os
ZipOutputStream zos = new ZipOutputStream(os);
// 对传递过来的路径进行遍历
for (String path : paths) {
// 如果传递过来的路径为空,则不进行这次循环,以免出错
if (path.equals(""))
continue;
File file = new File(path);
// 之后,如果这个路径存在,则分两种情况,一种是文件夹,另一种是文件
if (file.exists()) {
if (file.isDirectory()) {
zipDirectory(zos, file.getPath(), file.getName()
+ File.separator);
} else {
zipFile(zos, file.getPath(), "");
}
}
}
zos.close();
}
整个文件连起来是这样的:
package zipTest;
import java.io.*;
import java.util.*;
import org.apache.tools.zip.*;
public class zipTest {
// 如果是文件夹,则循环递归这个方法,因为还要读取旗下的所有子文件夹与子文件。
private static void zipDirectory(ZipOutputStream zos, String dirName,
String basePath) throws Exception {
File dir = new File(dirName);
if (dir.exists()) {
File files[] = dir.listFiles();
if (files.length > 0) {
for (File file : files) {
// 读取的时候同样分两种情况,文件、文件夹
if (file.isDirectory()) {
zipDirectory(
zos,
file.getPath(),
basePath
+ file.getName().substring(
file.getName().lastIndexOf(
File.separator) + 1)
+ File.separator);
} else
zipFile(zos, file.getPath(), basePath);
}
// 如果是一个空文件夹
} else {
// 直接压缩就可以了
ZipEntry ze = new ZipEntry(basePath);
zos.putNextEntry(ze);
}
}
}
private static void zipFile(ZipOutputStream zos, String filename,
String basePath) throws Exception {
// 如果是文件,应该利用输入输出流,分段压缩
File file = new File(filename);
if (file.exists()) {
FileInputStream fis = new FileInputStream(filename);
ZipEntry ze = new ZipEntry(basePath + file.getName());
zos.putNextEntry(ze);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = fis.read(buffer)) > 0) {
zos.write(buffer, 0, count);
}
fis.close();
}
}
public static void compress(OutputStream os, String... paths)
throws Exception {
// 指定输出的地方就是传过来的os
ZipOutputStream zos = new ZipOutputStream(os);
// 对传递过来的路径进行遍历
for (String path : paths) {
// 如果传递过来的路径为空,则不进行这次循环,以免出错
if (path.equals(""))
continue;
File file = new File(path);
// 之后,如果这个路径存在,则分两种情况,一种是文件夹,另一种是文件
if (file.exists()) {
if (file.isDirectory()) {
zipDirectory(zos, file.getPath(), file.getName()
+ File.separator);
} else {
zipFile(zos, file.getPath(), "");
}
}
}
zos.close();
}
public static void main(String[] args) throws Exception {
// 先读取f:/bb下的所有文件的路径
ArrayList<String> dirStrArr = new ArrayList<String>();
File dir = new File("f:/bb");
if (dir.exists()) {
File files[] = dir.listFiles();
for (File file : files) {
dirStrArr.add(dir.getPath() + "/" + file.getName());
}
}
// 输出为f:/bb.zip,接着要求要求刚才读取到所有文件
compress(new FileOutputStream("f:/bb.zip"),
(String[]) dirStrArr.toArray(new String[0]));
}
}