java - 使用java运行linux复制和重命名命令

标签 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 命令,即使它没有复制和重命名文件。我应该怎么做才能运行复制和重命名命令才能从java程序成功运行。

最佳答案

您没有读取进程的标准错误。所以如果你的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正在报告错误。进行此更改应该可以让您看到报告的错误。

关于java - 使用java运行linux复制和重命名命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133925/

相关文章:

linux - 如何在linux终端上只打印txt文件?

java - 应用程序中设置首选项的奥利奥问题

Java : Super class array object assigned with sub class array object

java - 从 pom 加载 hello_stateless_ejb 项目

linux - 如何在linux中接收短信通知?

java - 如何从 LUAJ 执行 linux 终端命令?

linux - 如何验证字符串是否为字母数字组合(包含字母和数字)#linux #Bash

java - 如何将 JSON 文件反序列化为具有嵌套类的 ArrayList?

java - 如何判断 Facebook 是否首次登录 - Android

linux - 如何启动 docker 容器作为服务器