【发布时间】:2011-02-08 16:56:53
【问题描述】:
对不起这个听起来很奇怪的标题...
我有以下情况:我希望我的 Java 程序与外部控制台交互。为了将各个命令“发送”到该控制台,我需要模拟普通控制台上的“按下回车键”。为了澄清我想要什么,假设 mysql 没有其他 API,我需要通过控制台进行交互。虽然这不是我的实际问题,但已经足够接近了。
我有以下代码:
String command = "/usr/local/mysql/bin/mysql";
Process child = Runtime.getRuntime().exec(command);
StreamGobbler gobbler = new StreamGobbler(child.getInputStream());
gobbler.start();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(child.getOutputStream()));
out.write("help");
// here enter key needs to be pressed
out.flush();
// out.close();
如果对out.close() 的调用被执行,一切都很好。但是当然,这样我只能发送一个命令,这不是我想要的。但是如果out.close() 被省略,其他程序永远不会执行该命令。我的猜测是它仍在等待命令“完成”,这在普通控制台上可以通过按 enter 完成。 out.write(System.getProperty("line.separator")); 和 out.newLine();(相同)不能解决问题,out.write("\r\n"); 和 out.write((char) 26); (EOF) 也不能解决问题。
当然,可能是我做的完全错误(即错误的方法)。那么我会很感激一个指向正确方向的指针......
对此高度赞赏的任何帮助。
【问题讨论】:
-
您应该使用标准输出和标准错误输出流。您在这些直播中收到了什么?
-
你在什么系统上?您使用 Unix 路径,但尝试了 Windows EOF (Ctrl-Z = 26)? Unix EOF 是 Ctrl-D (=4),但发送肯定不是正确的。
-
@Mark Peters:对不起,我也应该为错误输出流添加一个 gobbler,但是除非
out.close()像指出的那样执行,否则两个流都不会收到任何信息。 @Sergey Tachenov:我在 Mac 上工作,Ctrl-D 也不起作用,但感谢您指出这一点。