File wd = new File("/bin");
Process proc = null;
try {
proc = Runtime.getRuntime().exec("/bin/bash", null, wd);
} catch (IOException e) {
logger.info(e);
e.printStackTrace();
}
if (proc != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
//out.println("su - root");
out.println("cp /usr/rock/Masterfile.xls /usr/rock/generatedfile/");
out.println("mv /usr/rock/generatedfile/Masterfile.xls /usr/rock/generatedfile/userid.xls");
try {
String line;
while ((line = in.readLine()) != null) {
logger.info(line);
}
proc.waitFor();
in.close();
out.close();
proc.destroy();
} catch (Exception e) {
logger.info(e);
e.printStackTrace();
}
}
我正在尝试复制主文件,并希望根据用户ID重命名。代码没有显示任何错误,但我没有看到我指定的文件夹中的任何文件。我尝试使用sudo root命令,即使它不复制和重命名文件。我该怎么做才能运行copy和rename命令从java程序成功运行。
答案 0 :(得分:2)
您没有阅读流程的标准错误。因此,如果您的cp
和mv
命令报告错误,您将无法看到它们。
可以从过程的标准错误中读取,但是如果你使用Runtime.getRuntime().exec()
则这很复杂,因为从标准错误中读取需要在单独的线程中完成,以便从标准输出中读取。
Java 5引入了一个用于运行外部进程的新类:ProcessBuilder。在我看来,ProcessBuilder的最大优势在于您可以将流程的标准错误重定向到其标准输出。这使您只能读取一个流,因此不需要单独的线程。
我建议您使用以下内容替换Runtime.getRuntime().exec(...)
的使用:
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.directory(wd);
builder.redirectErrorStream(true);
proc = builder.start();
如果没有复制文件,则cp
和mv
可能会报告错误。进行此更改应该可以让您看到报告的错误。