2013-02-15 107 views
0

我想使用7zip展開一個zip文件,但我不斷收到7zip使用情況打印輸出。使用7zip展開文件

拉鍊存在於C:\ TEMP

同樣的命令在批處理窗口成功:

C:\TEMP>7z x "tryThis.zip" 

我嘗試添加工作目錄的文件路徑,也沒有工作目錄, 什麼幫幫我。 - 我可以運行CMD/c命令,但我更願意保持代碼清潔

我在做什麼錯了?

謝謝!

String pathTo7ZipExe = "c:\\program files\\7-zip\\7z.exe"; 
String fileName ="tryThis.zip"; 
String workingDir = "c:\\temp\\"; 

Process process = Runtime.getRuntime().exec(
            new String[]{pathTo7ZipExe}, 
            new String[]{" x \"" + fileName +"\""}, 
            new File(workingDir)); 

BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
String line; 
while ((line = in.readLine()) != null) { 
     System.out.println(line); 
} 
// wait for zip to end. 
int exitVal = process.waitFor(); 

回答

6

請看看該機制的文檔爲Runtime.exec

什麼,你實際上是試圖做的是調用7-ZIP沒有參數,並提供參數作爲您的環境。環境是像Windows路徑等

,所以你可能會想要做的事,如:

Runtime.getRuntime().exec(new String[]{pathToZipExe, "x", fileName}, null, new File(workingDir)); 

在另一方面,我會強烈建議會對ZipInputStream看看它包含在Java的 - 使用您還可以解壓縮zip文件。

乾杯

+0

謝謝!這一個爲我工作。 – user648026 2013-02-15 22:23:40

+0

太棒了! - btw [this](http://www.kodejava.org/examples/334.html)將是java的ZipInputStream解決方案。一個優點是,您可以專門查找元素,而無需拆開整個存檔。 – 2013-02-15 22:25:39

1

你調用的exec它接受envp陣列作爲第二個參數的過載。這個envp數組根本不適用於參數,所以實際上你不會傳遞任何參數:這就是爲什麼你得到使用打印輸出的原因。

行情,空間是不是自己的參數的一部分:它們被用於分離成argv(含有少量的保留,這是針對Windows也是如此:這是怎麼CommandLineToArgW作品,即使有報價和空間的完整的原始命令行總是可用)。

因此,它應該是這樣的:

Runtime.getRuntime().exec(new String[]{pathTo7ZipExe, "x", fileName}, 
        new String[]{}, new File(workingDir)); 

(太糟糕了,我不知道Java的,所以代碼可能是unidiomatic,但它應該工作)。

+0

環境的一個小問題:null會繼承原始環境,新的'String [] {}'會產生一個空的環境(沒有PATH等設置) - 不知道這是否是想要的。 – 2013-02-15 22:12:18