我现在在linux机器上。我有一个Java程序可以运行一些linux命令,例如ps
,top
,list
或free -m
。
在Java中运行命令的方法如下:
Process p = Runtime.getRuntime().exec("free -m");
我如何通过Java程序收集输出?我需要处理输出中的数据。
答案 0 :(得分:14)
使用Process.getInputStream()
获取代表新创建过程的标准输出的InputStream
。
请注意,从Java启动/运行外部进程可能非常棘手并且存在很多陷阱。
this excellent article中描述了它们,它们也描述了它们的方法。
答案 1 :(得分:6)
要收集输出,您可以执行类似
的操作 Process p = Runtime.getRuntime().exec("my terminal command");
p.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line = "";
String output = "";
while ((line = buf.readLine()) != null) {
output += line + "\n";
}
System.out.println(output);
这将运行您的脚本,然后将脚本的输出收集到变量中。 Joachim Sauer的答案中的链接还有其他的例子。
答案 2 :(得分:0)
至于某些命令需要等待一段时间,添加p.waitFor();如果有必要的话。
public static void main(String[] args) {
CommandLineHelper obj = new CommandLineHelper();
String domainName = "google.com";
//in mac oxs
String command = "ping -c 3 " + domainName;
String output = obj.executeCommand(command);
System.out.println(output);
}
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
答案 3 :(得分:0)
调用外部流程的技术性非常复杂。 jproc库通过自动使用命令的输出并将结果作为字符串提供来帮助抽象。上面的例子将这样写:
String result = ProcBuilder.run("free", "-m");
它还允许设置超时,以便您的应用程序不会被未终止的外部命令阻止。
答案 4 :(得分:0)
public String RunLinuxGrepCommand(String command) {
String line = null;
String strstatus = "";
try {
String[] cmd = { "/bin/sh", "-c", command };
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = in.readLine()) != null) {
strstatus = line;
}
in.close();
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
String stackTrace = sw.toString();
int lenoferrorstr = stackTrace.length();
if (lenoferrorstr > 500) {
strstatus = "Error:" + stackTrace.substring(0, 500);
} else {
strstatus = "Error:" + stackTrace.substring(0, lenoferrorstr - 1);
}
}
return strstatus;
}
这个函数将给出任何linux命令的结果