我正在尝试使用7zip扩展zip文件,但我一直在获取7zip Usage打印输出。
zip存在于c:\ temp
中同一命令在批处理窗口中成功:
C:\TEMP>7z x "tryThis.zip"
我尝试将workdir路径添加到文件中,并且没有工作目录, 无济于事。 - 我可以使用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();
答案 0 :(得分:6)
请查看Runtime.exec
的文档您实际上要做的是调用不带参数的7-zip并将参数作为您的环境提供。环境就像Windows PATH等。
所以你可能想做类似的事情:
Runtime.getRuntime().exec(new String[]{pathToZipExe, "x", fileName}, null, new File(workingDir));
另一方面,我强烈建议您查看java中包含的ZipInputStream - 使用它还可以解压缩zip文件。
干杯
答案 1 :(得分:1)
你正在调用exec
的重载,它接受envp
数组作为第二个参数。这个envp
数组根本不用于参数,所以实际上你没有传递任何参数:这就是你获得用法打印输出的原因。
引号和空格本身不是参数的一部分:它们用于分隔成argv
(对于少量保留,对于Windows也是如此:CommandLineToArgW
的工作原理,即使完整的原始命令带引号和空格的行总是可用的。)
所以它应该是这样的:
Runtime.getRuntime().exec(new String[]{pathTo7ZipExe, "x", fileName},
new String[]{}, new File(workingDir));
(太糟糕了,我不懂Java,所以代码可能是单一的,但它应该有效。)