【发布时间】:2012-08-22 12:51:18
【问题描述】:
为了了解这种情况,我尝试描述我想要实现的目标: 我想创建一个 java 程序来启动另一个 java 程序(一个 minecraft 服务器),监视它的输出,并相应地向它的输入发送命令。
我能够从我的代码中启动 jar 程序,并且我还能够为它编写一个输出侦听器,目前仅将 jar 程序的输出打印到控制台。
我从我的代码运行的 jar 程序有一个带有文本输出面板的 gui,它在其中显示消息,以及一个输入字段 (textarea),我可以在其中给出命令。我的问题是,当我启动代码并启动程序时,一切正常,直到我想直接写入程序的输入字段。如果我在输入字段中输入任何字母,则 gui 会冻结。
我做错了什么?
这是我的代码:
public static void main(String[] args) {
try {
System.out.println("Starting.");
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("java -jar \"D:\\Program Files\\mc\\minecraft_server.jar\"");
// output both stdout and stderr data from proc to stdout of this process
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream());
errorGobbler.start();
outputGobbler.start();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
输出阅读器:
public class StreamGobbler extends Thread {
InputStream is;
// reads everything from is until empty.
StreamGobbler(InputStream is) {
this.is = is;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
System.out.println(line);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
提前致谢! :)
【问题讨论】:
-
为了简单起见,合并
out&err流。实际上在那里看到 2 个流,我愚蠢地认为 gobblers 正在消耗两个输出流,但它当然是在读取err和in。 使用out流! 并阅读exec info. page 中的链接文章并实施所有其他建议。 -
感谢您的建议,但问题仍然存在:为什么 gui 会冻结?我只是在运行程序。我没有缓和任何东西......
-
非常感谢您执行我的建议和编辑问题。哦,等等,您没有打扰。 “问题仍然存在:” 好吧,你是有明确动机去解决它的人,所以我会继续讨论评论 1 中推荐的那些事情。祝你好运!
-
好的。我合并了流。这显然与问题无关,它只是一个优化。我不明白为什么我要消耗 out strem?当我将输出插入阅读器并尝试阅读它时,什么也没发生,但是当我阅读“输入流”(从罐子的角度来看似乎是输出流)时,一切正常。我收到了 jar 发送的所有消息。我将实现其他的东西,但我想从这个开始。
-
“我将实现其他的东西,但我想从这个开始。” 从实现“其他的东西”开始,因为正如我在链接页面..“文章是首先检查进程是否失败的事情。实施所有提示..”
标签: java runtime.exec