有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的shell Unix命令

我试图用java执行unix命令,比如C中的system("ls");。 我试过这个,但它不打印任何东西:

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

有什么想法吗


共 (3) 个答案

  1. # 1 楼答案

    有一个很好的库来做这个zt-exec

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

    或者

    String output = new ProcessExecutor().command("ls")
          .readOutput(true).execute()
          .outputUTF8(); 
    
  2. # 2 楼答案

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

            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();
    

    但如果发生错误,进程将写入错误流,因此必须检查两个流

  3. # 3 楼答案

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

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

    使用外壳重定向到控制终端,可以得到类似的结果:

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