我有一个名为 Blockland.exe 的 .exe 程序正在运行。它使用一个名为 TorqueScript 的游戏引擎,但它是一个控制台应用程序,我认为它使用 c++ 使其成为一个应用程序。人们以前制作过流式传输 blockland.exe 控制台的程序,但现在找不到了。
一般来说,您将如何获得另一个正在运行的控制台应用程序的输出?一旦我得到这些行,我就知道如何使用它来做我需要做的事情,但是我将如何使用 Java 获得控制台应用程序的输出?
ProcessBuilder
在 java 中提供了一种执行外部操作系统命令和管道输入以及从外部命令读取输出的方法。这是一个示例:
List<String> command = new ArrayList<String>();
command.add("/path/to/Blockland.exe");
command.add("Other arguments");
ProcessBuilder procBuilder = new ProcessBuilder(command);
Process proc = procBuilder.start();
ProcessOutputReader outputReader =
new ProcessOutputReader(proc.getInputStream());
ProcessOutputReader errorReader =
new ProcessOutputReader(proc.getErrorStream());
Thread out = new Thread(outputReader);
out.start();
Thread error = new Thread(errorReader);
error.start();
proc.waitFor();
ProcessOutputReader
实现的类在哪里Runnable
。它开始从构造函数中提供的流中读取,直到流中出现文件结尾。这是可以读取输出并对其进行处理的线程。请注意,您必须使用单独的线程处理流,因为 java/OS 为子进程提供的缓冲区是有限的。如果子进程开始在任一流(错误/输出)中放入太多数据并且缓冲区变满,它将挂起。
例如它可能看起来像(实现不完整):
public class ProcessOutputReader
{
public void run()
{
int ch;
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(inpStream));
// The output can be of any size. So read in chunks
String line = reader.readLine();
while(line != null)
{
// handle line
line = reader.readLine();
}
}
catch (Exception e)
{
// handle exceptions
}
}
}