⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expzip.java

📁 java实现的一个简单的压缩功能
💻 JAVA
字号:
/*
 * 利用Java正则表达式和文件机制编写的压缩备份工具。
 */

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 一个根据正则表达式递归备份文件的实用程序。
 * 
 * @author Gary Chan
 */
public class ExpZip {
	/**
	 * 打印使用信息。
	 */
	private static void printUsage() {
		StringBuffer msg = new StringBuffer();

		msg.append("使用方法: \n");
		msg.append("\tjava ExpZip <path> <regexp>\n");
		msg.append("\t\t<path>: 完整的路径,路径下面所有文件都将被扫描\n");
		msg.append("\t\t<regexp>:Java风格的正则表达式\n");

		System.out.println(msg);
	}

	/**
	 * 递归搜索path所指定的文件夹内以及子文件夹内满足合正则表达式
	 * 的文件并添加到list中去。
	 * 
	 * @param path 文件夹
	 * @param list 满足正则表达式的文件列表
	 */
	private static void recursiveAppend(File path, ArrayList list, String regex) {
		// 搜索path文件夹中符合要求的文件并添加到list里。
		File[] files = path.listFiles(new FileFilter(regex));
		if (files.length > 0) {
			for (int i = 0; i < files.length; i++) {
				list.add(files[i].getAbsolutePath());
			}
		}

		// 递归搜索path子文件夹。
		File[] subFolders = path.listFiles(new FolderFilter());
		if (subFolders.length > 0) {
			for (int i = 0; i < subFolders.length; i++) {
				recursiveAppend(subFolders[i], list, regex);
			}
		}
	}

	/**
	 * 主函数。注意,当程序出现任何异常时,都将打印使用信息,
	 * 提示用户参考使用信息进行操作。
	 */
	public static void main(String[] args) {
		// 程序出现任何异常都将打印使用信息。
		try {
			// 记录正则表达式和路径名称。
			String regex = args[1];
			String targetFolder = args[0];

			File path = new File(targetFolder);
			ArrayList files = new ArrayList();

			// 递归搜索path所指定的文件夹内以及子文件夹内满足合正则表达式的文件。
			recursiveAppend(path, files, regex);

			if (files.size() == 0) {
				System.out.println("找不到任何匹配的文件!");
				return;
			}

			// 把符合正则表达式的文件压缩成ZIP格式并且返回CRC校验值。
			FileOutputStream file = new FileOutputStream("Backup.zip");
			CheckedOutputStream csum = new CheckedOutputStream(file,
					new CRC32());
			ZipOutputStream zos = new ZipOutputStream(csum);
			BufferedOutputStream out = new BufferedOutputStream(zos);

			// 为ZIP包添加注释。
			zos.setComment("Backup " + regex + " in " + targetFolder);

			// 开始压缩。
			for (int i = 0; i < files.size(); i++) {
				String currentFile = (String) files.get(i);

				System.out.println("Writing file " + currentFile);
				BufferedReader in = new BufferedReader(new FileReader(
						currentFile));
				zos.putNextEntry(new ZipEntry(currentFile));
				int c;
				while ((c = in.read()) != -1)
					out.write(c);
				in.close();
			}
			out.close();

			// 当压缩包关闭以后便可以得到CRC校验值。
			System.out.println("CRC校验值:" + csum.getChecksum().getValue());
		} catch (Exception e) {
			printUsage();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -