从java代码运行jar程序时,jar程序';s的gui在直接输入时冻结
为了了解情况,我试着描述一下我正在努力实现的目标: 我想创建一个java程序来启动另一个java程序(minecraft服务器),监视它的输出,并相应地向它的输入发送命令 我可以从我的代码中启动jar程序,我还可以为它编写一个输出监听器,目前只将jar程序的输出打印到控制台 我在代码中运行的jar程序有一个gui,其中有一个文本输出面板,显示消息,还有一个输入字段(textarea),我可以在其中发出命令。我的问题是,当我启动代码并启动程序时,一切正常,直到我想直接写入程序的输入字段。如果我在输入字段中键入任何字母,gui将冻结 我错了什么 这是我的密码:从java代码运行jar程序时,jar程序';s的gui在直接输入时冻结,java,runtime.exec,Java,Runtime.exec,为了了解情况,我试着描述一下我正在努力实现的目标: 我想创建一个java程序来启动另一个java程序(minecraft服务器),监视它的输出,并相应地向它的输入发送命令 我可以从我的代码中启动jar程序,我还可以为它编写一个输出监听器,目前只将jar程序的输出打印到控制台 我在代码中运行的jar程序有一个gui,其中有一个文本输出面板,显示消息,还有一个输入字段(textarea),我可以在其中发出命令。我的问题是,当我启动代码并启动程序时,一切正常,直到我想直接写入程序的输入字段。如果我在输
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();
}
}
}
提前感谢!:) 首先,不要使用流gobbler,只需继承进程的io即可:
final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO();
p1.start();
如果您不关心stdin/out,请使用此命令将所有内容定向到NUL(windows版本的/dev/null):
程序仍然崩溃吗?为了简单起见,将
流合并到之外
和错误
流中。实际上在那里看到了两条流,我愚蠢地认为狼吞虎咽者正在消耗这两条输出流,但它当然是在
中读取err
&。消耗out
流!并浏览链接文章&实现所有其他建议。感谢您的建议,但问题仍然是:gui为什么会冻结?我只是在运行这个程序。我不是在磨炼任何东西…很高兴你能实施我的建议并编辑这个问题。。哦,等等,你没有麻烦。问题仍然是:“好吧,你是一个有明确动机去解决它的人,所以我会继续评论1中推荐的那些事情。”。祝你好运可以我把溪流汇合在一起。这显然与问题无关,它只是一个优化。我不明白的是,我为什么要吃外卖?当我将数据挖掘到一个读卡器中并试图读取它时,什么都没有发生,但是当我读取“输入流”(从jar的角度看,似乎是输出流)时,一切都正常。我收到了jar发送的所有消息。我会实现其他事情,但我想从这个开始。“我会实现其他事情,但我想从这个开始。”从实现“其他事情”开始,因为,正如我在链接页面中所写的。。“这篇文章是检查流程是否失败的第一件事。实现所有提示…”
p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL")))
.redirectError(Redirect.to(new File("NUL")));