2015-04-30 82 views
0

因此,我一直在研究一个Java应用程序,它应该让人们使用带有界面的程序运行他们的Minecraft服务器。当你运行一个shell脚本时,所有的输出都放在窗口中,然后你可以写入输入。输入然后由过程读取并解释。这使您可以使用子命令,如“开始”,“停止”,“帮助”,“操作”等。但是,我无法弄清楚如何将输入发送到流程。阅读到进程冻结控制台

这是控制台的样子:

http://gyazo.com/cda6e7c25f9c450ca597587cadced745.png

我试过如下:

public void createConsoleInput(final InputStream inputStream /* Obtained via process.getInputStream() */) 
{ 
    final Thread consoleThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      final BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); 
      consoleInput.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent e) 
       { 
        try 
        { 
         String cmd = consoleInput.getText(); 
         lastmessage = cmd; 

         System.out.println("» /" + cmd); 
         br.read(cmd.toCharArray()); 
         consoleInput.setText(""); 
        } 
        catch (IOException e1) 
        { 
         e1.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }; 
    consoleThread.start(); 
} 

领域,这是我在上面的图片中标记为 “输入”,加速时,将执行actionPerformed()方法。但是,它似乎冻结在线上:br.read(cmd.toCharArray());

它在外部死亡后解冻。它甚至不会执行System.out部分,直到之后被杀死。所以,我的问题是:我如何正确地做到这一点?

编辑:

将其更改为一个作家,不再挂起后。相反,它只是打印控制台消息:

public void createConsoleInput(final BufferedWriter writer) 
{ 
    final Thread consoleThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      consoleInput.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent e) 
       { 
        try 
        { 
         String cmd = consoleInput.getText(); 
         lastmessage = cmd; 

         System.out.println("» /" + cmd); 
         writer.write(cmd); 
         consoleInput.setText(""); 
        } 
        catch (IOException e1) 
        { 
         e1.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }; 
    consoleThread.start(); 
} 

作者是这样访问:

BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

编辑2:我已经试过用代码乱搞,但似乎没有任何修复它。我觉得我只是写错了一个字。

+0

的'InputStream'是你可以*从*阅读 - 这是从*你*角度输入(但它是从另一个进程的角度输出) – immibis

+0

@immibis:啊,谢谢。查看我的编辑。 – ColonelHedgehog

+0

如果你在命令后面写了一个换行符,它会工作吗? – immibis

回答

0

固定!我只需要冲洗作家。请看:

public void createConsoleInput(final BufferedWriter writer) 
{ 
    final Thread consoleThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      consoleInput.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent action) 
       { 
        try 
        { 
         String cmd = consoleInput.getText(); 
         lastmessage = cmd; 

         System.out.println("» /" + cmd); 
         writer.write(cmd + "\n"); 
         consoleInput.setText(""); 
         writer.flush(); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }; 
    consoleThread.start(); 
}