2012-08-22 22 views
2

为了理解这种情况,我试着描述一下我想实现的: 我想创建一个启动另一个java程序的java程序(一个Minecraft服务器),监视它的输出,并相应地发送命令给它的输入。当从java代码运行jar程序时,jar程序的gui冻结在直接输入上

我能够从我的代码启动jar程序,我也能够为它编写一个输出监听器,它目前只能将jar程序的输出打印到控制台。

我从我的代码运行的jar程序有一个文本输出面板,它显示消息和一个输入字段(textarea)我可以给命令的GUI。我的问题是,当我开始我的代码,它启动程序一切正常,直到我想直接写入程序的输入字段。如果我在输入字段中输入任何字母,则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

为了简单起见,合并'out'&'err'流。实际上在那里看到两条溪流,我愚蠢地认为狼吞虎咽正在消耗输出流,但当然它正在读'错误'。 ***消费'out'流!***并通过[exec info链接的文章。页面](http://stackoverflow.com/tags/runtime.exec/info)&执行所有其他建议。 –

+0

感谢您的建议,但问题依然存在:为什么gui会冻结?我只是在运行这个程序。我没有锻炼任何东西...... – Angezerus

+0

很好,你实施我的建议和编辑问题..哦,等等,你没有打扰。 *“问题依然存在:”*好吧,你是一个有着明确动机去解决问题的人,所以我会接受评论1中推荐的那些东西。祝你好运! –

回答

1

首先,而是采用了流火鸡,只是继承进程的IO:

final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO(); 
p1.start(); 

如果你不关心标准输入/输出,用此来引导一切NUL(窗口版本/ dev/null):

p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL"))) 
         .redirectError(Redirect.to(new File("NUL"))); 

程序是否仍然崩溃?