Java咖啡館——一個壓縮歸檔實(shí)用軟件(4)
發(fā)表時間:2024-05-15 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]6.ZIP壓縮和CRC校驗(yàn) 良好的開端是成功的一半,有了上面的準(zhǔn)備,完成主程序也就很容易了。public static void main(String[] args) { // 程序出現(xiàn)任何異常都將打印使用信息。 try { // 記錄正則表達(dá)式和路徑名稱。 Str...
6.ZIP壓縮和CRC校驗(yàn)
良好的開端是成功的一半,有了上面的準(zhǔn)備,完成主程序也就很容易了。
public static void main(String[] args) {
// 程序出現(xiàn)任何異常都將打印使用信息。
try {
// 記錄正則表達(dá)式和路徑名稱。
String regex = args[1];
String targetFolder = args[0];
File path = new File(targetFolder);
ArrayList files = new ArrayList();
// 遞歸搜索path所指定的文件夾內(nèi)以及子文件夾內(nèi)滿足合正則表達(dá)式。
recursiveAppend(path, files, regex);
if (files.size() == 0) {
System.out.println("找不到任何匹配的文件!");
return;
}
// 把符合正則表達(dá)式的文件壓縮成ZIP格式并且返回CRC校驗(yàn)值。
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();
// 當(dāng)壓縮包關(guān)閉以后便可以得到CRC校驗(yàn)值。
System.out.println("CRC校驗(yàn)值:" + csum.getChecksum().getValue());
} catch (Exception e) {
printUsage();
}
}
首先可以看到,整個main函數(shù)部分是用一個大的try...catch異常捕獲語句容納起來的,當(dāng)程序出現(xiàn)任何異常時,我們都認(rèn)為是用戶的參數(shù)不正確,便調(diào)用printUsage()方法打印使用信息,具體代碼從略。
首先通過recursiveAppend()方法遞歸搜索指定的文件夾內(nèi)以及子文件夾內(nèi)滿足合正則表達(dá)式的文件名,結(jié)果將保存在files中。如果有滿足條件的文件,則把這些文件壓縮成ZIP格式,并添加適當(dāng)?shù)淖⑨。?dāng)壓縮包關(guān)閉以后便可以得到ZIP包的CRC校驗(yàn)值。
注意,以上這些代碼使用的都是Java API內(nèi)置的功能,如果你在編寫的過程中遇到找不到類定義的情況,別忘記使用Eclipse內(nèi)置的Ctrl+Shift+M自動導(dǎo)入功能。
至此,整個軟件全部編寫好了。你可以在命令行手動輸入把玩一下,或者點(diǎn)擊Run菜單的Run...菜單項(xiàng),配置Eclipse運(yùn)行的參數(shù)如圖2所示。