2013-02-15 104 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