Java利用Runtime执行命令行,在windows上面可以调用成功,但在Linux上有时候调用失效,记录一下Linux环境中,java调用命令行执行程序:
主要这句话很重要:
命令前加sudo也可以
String[] cmdArray = new String[] { "/bin/sh", "-c", cmd };
另,Linux环境调用命令行时,如果命令行中包含()或&符号等,会终止命令,本例中文件名中包含(),那么就需要在文件名两端加上""号,把文件路径括起来,执行成功。
private void execCommand(String zipName,String pFile) {
try {
Runtime runtime = Runtime.getRuntime();
// 打开任务管理器,exec方法调用后返回 Process 进程对象
//程序包所在目录的的完整路径,如/usr/john/
String root = "/usr/john/zip2John";
String cmd = " \""+zipName+"\" > "+pFile;
logger.info("命令----------------------"+root +cmd);
// 等待进程对象执行完成,并返回“退出值”,0 为正常,其他为异常
String[] cmdArray = new String[] { "/bin/sh", "-c", root+cmd };
Process process = runtime.exec(cmdArray);
//程序返回写入到文件中
FileWriter ft = new FileWriter(pFile);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
String line = "";
while ((line=bufferedReader.readLine())!=null){
ft.write(line);
System.out.println(line);
}
ft.flush();
int exitValue = process.waitFor();
System.out.println("exitValue: " + exitValue);
// 销毁process对象
process.destroy();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
|