📄 expzip.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 + -