我们的Java程序的外部程序

如何用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

Java为此提供的API是ProcessBuilder 。 设置工作目录和传递参数相对简单。

有点棘手的是传递STDIN并读取STDERR和STDOUT,至少对于非平凡的大小,因为你需要启动单独的线程以确保清除相应的缓冲区。 否则,您调用的应用程序可能会阻塞,直到它可以写入更多输出,如果您还等待该进程完成(不确定STDOUT被读取),您将死锁。

您可以使用java.lang.Process和java.lang.ProcessBuilder 。 您可以使用getInputStream / getOutputStream / getErrorStream与进程的输入/输出进行交互。

但是,有一个名为Exec的Apache Commons库,旨在使所有这些变得更容易。 (在引用命令行参数等时,它通常会变得很毛茸茸。)我自己没有使用过Exec,但值得一试。

当你只想启动其他程序时,你可以像这样使用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 name=value. @param dir the working directory of the subprocess, or null if the subprocess should inherit the working directory of the current process. 

请不要编辑您的问题,使其不再符合原始答案。 如果您有后续问题,请明确标记,或将其作为单独的问题,或使用评论或其他内容。

至于您的IOException,请提供它显示的错误消息。

此外,似乎您正在尝试直接运行“.java”文件。 这是行不通的。 这里描述的方法是启动本机二进制可执行文件。 如果要运行“.java”文件,则必须将其编译为类,并调用该类的main方法。

你在哪个平台?

如果你在* nix,你可以输入:

java MyProgram | myexternalprogram> myfilename.txt