1、如果在Java要压缩一个文件夹及其所有子文件与子文件夹,可以利用到Apache公司提供的ant插件。其实也就是一个jar包。
2、首先先到Apache的官网,下载ant插件,地址:http://ant.apache.org/bindownload.cgi(点击打开链接)
3、代码示例:
- 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]));
- }
- }