之前使用過Java API進行檔案的壓縮與解壓縮,對於中文的處理問題是一個很大的問題(這個問題在新版的java jdk裡面好像已經解決),由於這個原因,後來找來了Apache解決了中文問題. 但是不管是使用jdk內建的還是外部的API,進行檔案的壓縮效能都提不上去.這種方式要是壓縮比較大的檔案時,要佔用太多的虛擬機器資源,這不是什麼好的點子.
在這篇部落格中,將簡單說明怎麼用Java API調用外部程式進行檔案的壓縮和解壓縮. 1.使用外部程式:7zip進行檔案的壓縮.可以在這裡下載:7zip 綠色版命令列打包工具. 7zip是一個很小的命令列打包工具,使用java調用外部程式進行打包,它是不二之選.關於7zip的一些命令可以把該檔案下載下來後,在dos命令視窗開啟該程式,所有命令都顯示出來,具體不作詳細的介紹了. 2.批處理命令:xx.bat 相信熟悉Linux的朋友,這個不陌生,在window下使用批處理命令同樣能帶來很大的方便.在該案例中使用到簡單地批處理命令語句.更詳細的批處理語句可以網上找下,比如這個:bat命令學習.跳過跳過.. 3.主要操作:
a. 把7zip下載下來後,選一個適合自己的版本,我用X86的.把x86類型的7za.exe拷貝到你自己的項目中,寫一個代碼能索引到7za.exe所在的包目錄.
b.同樣在7za.exe所在的包的目錄下,存放一份bat的檔案,我的命名zip.bat,裡面代碼如下
set thisPath=%1
set zipName=%2
set fileName=%3
%thisPath%\7z a -r -tzip %thisPath%\%zipName%.zip %thisPath%\%fileName% 注釋:7z為7za.exe的命名,我的項目裡命名為7z.exe.其他是傳進來的
調用的時候,三個變數要傳進來,當前的路徑thisPath(就是7za.exe所在的絕對路徑),要壓縮的成的壓縮檔名zipName和對那個檔案進行操作的fileName.
說明下,這裡我的臨時檔案是都在thisPath下的,產生的壓縮檔也臨時放在這裡.要是是對不同路徑下的檔案進行壓縮和存放在壓縮後的檔案在不同的地方的時候,可以把這些檔案的前面的thisPath的參數換掉,視具體情況而定.比如我想存放壓縮好的檔案到其他地方去,最後一句bat語句可以這樣寫:
set fileName=%3
set storeZipPath=%4
%thisPath%\7z a -r -tzip %storeZipPath%\%zipName%.zip %thisPath%\%fileName%
但是thisPath變數一定要能索引到7za.exe檔案.
c.java 調用代碼:
private static java.io.File generateZip(String zipName,String fileName)
{
java.io.File file = new java.io.File(getTempPath()+"/"+fileName);
if(!file.exists())
{
return null;
}
Runtime run = Runtime.getRuntime();
BufferedInputStream in=null;
BufferedReader inBr=null;
Process process=null;
try {
StringBuffer cmd =new StringBuffer();
cmd.append(getTempPath()+"\\"+"zip.bat");
cmd.append(" "); //傳參的時候以空格符分開代表第幾個參數.
cmd.append(getTempPath()); //傳第一個參數
cmd.append(" ");
cmd.append(zipName); //傳第二個參數
cmd.append(" ");
if(file.isFile())
{
cmd.append(fileName); //傳第三個參數
}
else
{
cmd.append(fileName+"\\*"); //這裡說明下 7zip 壓縮檔夾的時候的命令是:[7za a -r -tzip zipName fileName\*]後面的\*是指明遞迴,
//別忘記要當時檔案夾時要傳進去.
}
process =run.exec(cmd.toString()); //執行語句 ,這句後面的就是輸出語句了,要是想不看輸出,後面的代碼可以酌情刪除
in = new BufferedInputStream(process.getInputStream());
inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null)
{
System.out.println(lineStr);
}
if (process.waitFor() != 0)
{
if (process.exitValue() == 1)
{
System.err.println("命令執行失敗!");
}
}
file.delete();
file=null;
java.io.File zipFile = new java.io.File(getTempPath()+"/"+fileName+".zip");
if(zipFile.exists())
{
return zipFile;
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(null!=inBr)
{
inBr.close();
}
if(null!=in)
{
in.close();
}
}catch (Exception e )
{
e.printStackTrace();
}
}
return null;
}
d.執行結果:
看命令列輸出 :
打包後的結果:
打完收工!!!!