用java运行linux copy和rename命令

时间:2012-02-03 18:52:53

标签: java linux

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程序成功运行。

1 个答案:

答案 0 :(得分:2)

您没有阅读流程的标准错误。因此,如果您的cpmv命令报告错误,您将无法看到它们。

可以从过程的标准错误中读取,但是如果你使用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();

如果没有复制文件,则cpmv可能会报告错误。进行此更改应该可以让您看到报告的错误。