为了理解这种情况,我试着描述一下我想要实现的目标: 我想创建一个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();
}
}
}
提前致谢! :)
答案 0 :(得分:1)
首先,不要使用流gobbler,只需继承进程的io:
final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO();
p1.start();
如果您不关心stdin / out,请使用此命令将所有内容指向NUL(Windows版本的/ dev / null):
p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL")))
.redirectError(Redirect.to(new File("NUL")));
程序是否仍然崩溃?