【问题标题】:Unix commands in javajava中的Unix命令
【发布时间】:2014-01-18 09:33:52
【问题描述】:

我正在尝试在 java 中执行 unix 命令,例如 C 中的 system("ls");。 我试过了,但它不打印任何东西:

Process p=Runtime.getRuntime().exec("ls");
OutputStream in=p.getOutputStream();
PrintStream print = new PrintStream(in);
print.println("String");

有什么想法吗?

【问题讨论】:

标签: java shell unix terminal


【解决方案1】:

您可以使用较新的ProcessBuilder 类,它比Runtime.exec 方法具有更多选项。看不到任何输出的原因是因为新进程的标准输出流默认通过管道连接到 JVM。您可以使用redirectOutput 方法使新进程继承JVM 的标准输出:

ProcessBuilder pb = new ProcessBuilder("ls");
pb.redirectOutput(Redirect.INHERIT);
Process p = pb.start();

使用 shell 重定向到控制终端可以获得类似的结果:

ProcessBuilder pb = new ProcessBuilder("sh", "-c", "ls > /dev/tty");
Process p = pb.start();

【讨论】:

  • 我在 Redirect.INHERIT 中收到“重定向无法解析为变量”错误,我必须导入一些东西吗? eclipse 没有任何建议
  • 您可以添加import java.lang.ProcessBuilder.Redirect 或写ProcessBuilder.Redirect 而不仅仅是Redirect
  • 我找到了 ProcessBuilder 但没有找到 ProcessBuilder.Redirect,再次“无法解决”:S
  • 在这种情况下,您必须使用 Java 6 或更早版本; ProcessBuilder.Redirect 是在 Java 7 中添加的。有一些变通方法,例如使用 shell 重定向(请参阅我的更新)或自己读取管道(如 Serdar 的回答)。考虑到 Java 6 的公共更新已经结束,甚至 Oracle 的主要支持已经结束,您可能需要考虑迁移到 Java 7 或 8。
【解决方案2】:

有一个很好的库可以做到这一点zt-exec

new ProcessExecutor().command("ls")
      .redirectOutputAsInfo().execute();

String output = new ProcessExecutor().command("ls")
      .readOutput(true).execute()
      .outputUTF8(); 

【讨论】:

    【解决方案3】:

    您必须从处理输入流中读取命令响应(如果有),如下所示:

            Process p=Runtime.getRuntime().exec("net time");
    
            InputStream is = p.getInputStream(); //or p.getErrorStream() on error
            int c;
            StringBuilder commandResponse = new StringBuilder();
    
            while( (c = is.read()) != -1) {    //read until end of stream
                commandResponse.append((char)c);
            }
            System.out.println(commandResponse);   //Print command response
            is.close();
    

    但是如果发生错误进程写入错误流所以你必须检查两个流。

    【讨论】:

    • 这个答案也有效,为简单起见我选择另一个
    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多