0

我正在尝试使用 7zip 扩展 zip 文件,但我不断收到 7zip Usage 打印输出。

zip 存在于 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();  
4

2 回答 2

6

请查看Runtime.exec的文档

您实际尝试做的是不带参数调用 7-zip 并将参数提供为您的环境。环境类似于 Windows PATH 等。

所以你可能想要做类似的事情:

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

另一方面,我强烈建议您查看java 中包含的ZipInputStream - 使用它您还可以解压缩 zip 文件。

干杯

于 2013-02-15T22:06:56.237 回答
1

您正在调用exec接受envp数组作为第二个参数的重载。这个envp数组根本不用于参数,所以实际上你没有传递任何参数:这就是你得到用法打印输出的原因。

引号和空格本身不是参数的一部分:它们用于分隔argv(稍有保留,Windows 也是如此:这就是CommandLineToArgW工作原理,即使带有引号和空格的完整原始命令行始终可用)。

所以它应该是这样的:

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

(太糟糕了,我不懂 Java,所以代码可能是单一的,但它应该可以工作)。

于 2013-02-15T22:08:53.600 回答