我知道如何使用的Runtime.exec ,你传递一个本地程序运行+论据。 如果它是一个正规的程序,可以直接运行它。 如果它是一个shell脚本,你必须运行像一个外壳程序sh
或csh
或cmd.exe
。
有没有一个实现了壳,这意味着你传递一个命令字符串或脚本到程序,执行命令和重定向一些Java类(标准或开源)标准I / O / ERR因此,这样你就可以通过一个字符串如foo | bar > baz.out
foo | bar > baz.out
中,它会运行foo
和bar
计划W / O不必运行Java的其他可执行之外?
(和壳我不是说BeanShell的或独立的犀牛Javascript解释,这些都是Java实现执行Java和JavaScript代码。我说的是Java实现执行非Java可执行文件和处理重定向我的水暖/ O 。)
好吧,我的工作了:
基本上,你需要调用的bash用"-s"
,然后完整的命令字符串写入。
public class ShellExecutor {
private String stdinFlag;
private String shell;
public ShellExecutor(String shell, String stdinFlag)
{
this.shell = shell;
this.stdinFlag = stdinFlag;
}
public String execute(String cmdLine) throws IOException
{
StringBuilder sb = new StringBuilder();
Runtime run = Runtime.getRuntime();
System.out.println(shell);
Process pr = run.exec(cmdLine);
BufferedWriter bufWr = new BufferedWriter(
new OutputStreamWriter(pr.getOutputStream()));
bufWr.write(cmdLine);
try
{
pr.waitFor();
} catch (InterruptedException e) {}
BufferedReader buf = new BufferedReader(
new InputStreamReader(pr.getInputStream()));
String line = "";
while ((line = buf.readLine()) != null)
{
sb.append(line + "\n");
}
return sb.toString();
}
}
然后使用它是这样的:
ShellExecutor excutor = new ShellExecutor("/bin/bash", "-s");
try {
System.out.println(excutor.execute("ls / | sort -r"));
} catch (IOException e) {
e.printStackTrace();
}
很明显,你有啥可做一些与错误字符串但是这是一个工作的例子。
由于JDK 1.5有java.lang.ProcessBuilder中负责处理性病犯错流为好。 这有点更换为java.lang.Runtime中的
你一直可以用的Runtime.exec处理流
如
String cmd = "ls -al";
Runtime run = Runtime.getRuntime();
Process pr = run.exec(cmd);
pr.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = "";
while ((line=buf.readLine())!=null) {
System.out.println(line);
}
但是,如果你想要把诸如管壳字符和重定向在那里你必须写你自己的命令行分析器哪个环节出流。 据我所知,还没有一个被写入。 话虽这么说,你能不能从Java调用庆典用-c“LS |排序”例如,然后读取输入。 嗯时间做一些测试。
您可以使用Java提供的API的ProcessBuilder。
Runtime.getRuntime().exec(...)
采取任一字符串数组或一个字符串。 的单串重载exec()
将tokenise串入参数数组,字符串数组传递到所述的一个之前exec()
的重载采用一个字符串数组。 所述ProcessBuilder
构造,另一方面,只需要串的可变参数阵列或字符串,其中,所述阵列中的每个串或列表被假定为一个单独的参数的列表。 无论哪种方式,获得的参数,然后加入成传递给OS执行的字符串。
寻找在下面的链接的详细信息的ProcessBuilder和的Runtime.exec之间的差异()
示例程序来执行命令。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.List;
public class ProcessBuilderTest {
static ProcessBuilder processBuilder = null;
static Process spawnProcess = null;
static int exitValue;
static int pid;
static List<String> commands;
public static void main(String[] args) {
runSqoop();
}
public static void runSqoop() {
String[] commands = { "ssh", "node", "commands" };
processBuilder = new ProcessBuilder(commands);
try {
System.out.println("Executing " + commands.toString());
spawnProcess = processBuilder.inheritIO().start();
try {
exitValue = spawnProcess.waitFor();
pid = getPID(spawnProcess);
System.out.println("The PID is " + pid);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("Process exited with the status :" + exitValue);
} catch (Exception e) {
e.printStackTrace();
}
}
public static int getPID(Process process) {
try {
Class<?> processImplClass = process.getClass();
Field fpid = processImplClass.getDeclaredField("pid");
if (!fpid.isAccessible()) {
fpid.setAccessible(true);
}
return fpid.getInt(process);
} catch (Exception e) {
System.out.println(e.getMessage());
return -1;
}
}
}