【Java】利用ant插件压缩文件夹及其所有子文件与子文件夹

如果在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]));
	}
}
时间: 2024-10-29 19:11:26

【Java】利用ant插件压缩文件夹及其所有子文件与子文件夹的相关文章

Java使用递归找出某目录下的所有子目录以及子文件

1 /* 2 使用递归找出某目录("C:\\JavaProducts")下的所有子目录以及子文件 3 */ 4 5 import java.util.*; 6 import java.io.*; 7 8 public class FileRecursionPrintDemo{ 9 public static void main(String[] args){ 10 List<String> paths = new ArrayList<String>(); 11

利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件

2016-11-18 这是本人的第一篇随笔博客,纠结了半天还是选择自己学的时候比较用心的一些知识点上.利用java.io.File类指定本地的文件夹进行遍历所有的文件. package org.lxm.filedemo; import java.io.File; import java.util.Scanner; /* * 本程序是将某个盘的所有文件夹及其文件全部调出来的操作 */ public class FileAllDemo { public static void main(String

gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)

gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩js文件夹下的index.js文件输出到dist文件夹下面(注意要压缩的js文件中此处只能使用es5) 1 var gulp = require('gulp'); 2 var uglify = require('gulp-uglify'); 3 4 gulp.task("uglify",f

Java开发技巧:如何利用Ant手动构建工程

利用Java语言构建工程,在这过程中主要是编译.打包.运行.部署等操作.将工程中的一个src文件夹用来放置工程的源代码,其中只有一个类的源代码. 在HelloWorld中新建HelloWorld.java代码如下: public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } } 在没有使用Ant之前,先采用手工的方式来构建这个HelloWor

【Java】移动文件夹及其所有子文件与子文件夹

在Java移动文件夹及其所有子文件与子文件夹可以有如下的一段简单的方法来说明: public static void moveFolder(String oldPath, String newPath) { //先复制文件 copyFolder(oldPath, newPath); //则删除源文件,以免复制的时候错乱 deleteDir(new File(oldPath)); } 不应该直接剪切文件,防止在剪切的时候出错,导致这样那样的问题. 在Java复制文件夹及其所有子文件与子文件夹,在<

Java用ZIP格式压缩和解压缩文件

转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutputstream能够实现文件压缩,全部写入到zipoutputstream输入流中的数据,都会被ZIP格式压缩. 每一个被压缩的文件或者文件夹在zip文件里都相应一个zipentry对象,每一个zipentry都有一个name属性,表示它相对于zip文件文件夹的相对路径,对于文件夹,路径以“/“结尾,对

Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

原创文章,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4535459.html android 程序打包成apk,如果在是命令行方式,一般都要经过如下步骤: 1.用aapt命令生成R.java文件 2.用aidl命令生成相应java文件 3.用javac命令编译java源文件生成class文件 4.用dx.bat将class文件转换成classes.dex文件 5.用aapt命令生成资源包文件resources.ap_ 6.用apkbuilder.bat打包资源

服务器node中间间利用express插件托管静态文件

const express =require('express'); const app=express(); //实现静态资源服务 let server=app.use(express.static('public')); server.listen(3000,()=>{ console.log('public文件夹已经托管到服务器') }) 在本目录创建public文件夹,添加虚拟目录 // 服务器node中间间利用express插件托管静态文件 const express =require

JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件

package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要显示文件目录的层级 * 注:运用了递归的算法. */ public class FileDemo3 { public static void main(String[] args) { File dir=new File("F:\\黑马学习日程\\"); //File dir=new Fi