问题

我正在使用运行时从我的Java程序运行命令提示符命令。但是我不知道如何获得命令返回的输出。

这是我的代码:

Runtime rt = Runtime.getRuntime();

String[] commands = {"system.exe" , "-send" , argument};

Process proc = rt.exec(commands);

我试过做System.out.print(proc);但是没有返回任何东西。该命令的执行应该返回由分号分隔的两个数字,我怎样才能在变量中得到这个以打印出来?

这是我现在使用的代码:

String[] commands = {"system.exe","-get t"};

Process proc = rt.exec(commands);

InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);

String line = null;
System.out.println("<OUTPUT>");

while ( (line = br.readLine()) != null)
     System.out.println(line);

System.out.println("</OUTPUT>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);

但我没有得到任何东西作为我的输出,但当我自己运行该命令它工作正常。


#1 热门回答(172 赞)

这是要走的路:

Runtime rt = Runtime.getRuntime();
String[] commands = {"system.exe","-get t"};
Process proc = rt.exec(commands);

BufferedReader stdInput = new BufferedReader(new 
     InputStreamReader(proc.getInputStream()));

BufferedReader stdError = new BufferedReader(new 
     InputStreamReader(proc.getErrorStream()));

// read the output from the command
System.out.println("Here is the standard output of the command:\n");
String s = null;
while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
}

// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
    System.out.println(s);
}

更好地阅读Javadoc了解更多细节5666923414.ProcessBuilder将是不错的选择


#2 热门回答(47 赞)

更快的方法是:

public static String execCmd(String cmd) throws java.io.IOException {
    java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}

这基本上是这个的浓缩版本:

public static String execCmd(String cmd) throws java.io.IOException {
    Process proc = Runtime.getRuntime().exec(cmd);
    java.io.InputStream is = proc.getInputStream();
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    String val = "";
    if (s.hasNext()) {
        val = s.next();
    }
    else {
        val = "";
    }
    return val;
}

我知道这个问题已经过时但是我发布了这个答案,因为我觉得这可能会更快。


#3 热门回答(10 赞)

除了使用ProcessBuilder建议Senthil,一定要阅读并实施所有的建议When Runtime.exec() won't


原文链接