Java 读取进程冻结控制台
所以,我一直在开发一个Java应用程序,它应该让人们使用一个带有接口的程序来运行Minecraft服务器。当您运行shell脚本时,所有输出都放在窗口中,然后您就可以编写输入了。然后进程读取输入并对其进行解释。这允许您使用子命令,如“开始”、“停止”、“帮助”、“操作”等。但是,我不知道如何将输入发送到流程 这是控制台的外观: 我尝试了以下方法:Java 读取进程冻结控制台,java,shell,process,java-threads,Java,Shell,Process,Java Threads,所以,我一直在开发一个Java应用程序,它应该让人们使用一个带有接口的程序来运行Minecraft服务器。当您运行shell脚本时,所有输出都放在窗口中,然后您就可以编写输入了。然后进程读取输入并对其进行解释。这允许您使用子命令,如“开始”、“停止”、“帮助”、“操作”等。但是,我不知道如何将输入发送到流程 这是控制台的外观: 我尝试了以下方法: public void createConsoleInput(final InputStream inputStream /* Obtained v
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();
}
上图中我标记为“Input”的字段在加速时将执行actionPerformed()方法。但是,它似乎冻结在以下行:br.read(cmd.tocharray())代码>
在外部终止进程后,它将解冻。在它被杀死之前,它甚至不做系统输出部分。所以,我的问题是:我如何正确地做到这一点
编辑:
将其更改为writer后,它不再挂起。相反,它只打印控制台消息:
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=newbufferedwriter(newoutputstreamwriter(p.getOutputStream())代码>
编辑2:我试着把代码弄乱了,但似乎没有什么能解决它。我觉得我写错了流。修复!我只需要冲洗一下作者。看一看:
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();
}
InputStream
是您可以读取的东西-它是从您的角度进行的输入(但它是从另一个进程的角度进行的输出)@immibis:啊,谢谢。查看我的编辑。如果在命令后写一个换行符是否有效?@immibis:Nope。将其更改为writer.write(cmd+“\n”)代码>似乎没有改变任何东西。