如何用Java编写将执行另一个程序的程序?此外,该程序的输入应该从我们的程序中提供,该程序的输出应该写入文件。
这是我获取输出的一小部分代码:
Process p = Runtime.getRuntime().exec("C:\\j2sdk1.4.0\bin\\helloworld.java");
BufferedReader input =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null)
System.out.println(line);
input.close();
这是我的一组代码,但这会引发IOException
。
答案 0 :(得分:5)
Java为此提供的API是ProcessBuilder。设置工作目录和传递参数相对简单。
有点棘手的是传递STDIN并读取STDERR和STDOUT,至少对于非平凡的大小,因为你需要启动单独的线程以确保清除相应的缓冲区。否则,您调用的应用程序可能会阻塞,直到它可以写入更多输出,如果您还等待该进程完成(不确定STDOUT被读取),您将死锁。
答案 1 :(得分:4)
您可以使用java.lang.Process和java.lang.ProcessBuilder。您使用getInputStream / getOutputStream / getErrorStream与进程的输入/输出进行交互。
然而,有一个名为Exec的Apache Commons库,旨在使所有这些更容易。 (在引用命令行参数等时,它通常会变得非常毛茸茸。)我自己没有使用过Exec,但值得一试。
答案 2 :(得分:4)
当你只想启动其他程序时,你可以使用这样的exec方法:
Runtime r = Runtime.getRuntime();
mStartProcess = r.exec(applicationName, null, fileToExecute);
StreamLogger outputGobbler = new StreamLogger(mStartProcess.getInputStream());
outputGobbler.start();
int returnCode = mStartProcess.waitFor();
class StreamLogger extends Thread{
private InputStream mInputStream;
public StreamLogger(InputStream is) {
this.mInputStream = is;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(mInputStream);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
EXEC:
public Process exec(String command, String envp[], File dir)
@param command a specified system command.
@param envp array of strings, each element of which
has environment variable settings in format
<i>name</i>=<i>value</i>.
@param dir the working directory of the subprocess, or
<tt>null</tt> if the subprocess should inherit
the working directory of the current process.
答案 3 :(得分:2)
请不要编辑您的问题,使其不再符合原始答案。 如果您有后续问题,请明确标记,或将其作为单独的问题,或使用评论或其他内容。
关于您的IOException,请提供它显示的错误消息。
此外,您似乎正在尝试直接运行“.java”文件。那样不行。这里描述的方法是启动本机二进制可执行文件。如果要运行“.java”文件,则必须将其编译为类,并调用类“ main 方法。
答案 4 :(得分:1)
你在哪个平台?
如果你在* nix,你可以输入:
java MyProgram | myexternalprogram&gt; myfilename.txt