有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中,如何逐行读取正在运行的另一个控制台应用程序的内容?

我有一本书。程序名为Blockland。exe正在运行。它使用一个叫做TruScript的游戏引擎,但它是一个控制台应用程序,我认为使用C++来将它变成一个应用程序。人们制作了一些程序,在blockland的控制台上播放。exe之前,但现在找不到了

通常,如何获得另一个正在运行的控制台应用程序的输出?一旦我得到了这些行,我就知道如何使用它来做我需要做的事情,但是如何使用Java获得控制台应用程序的输出呢


共 (1) 个答案

  1. # 1 楼答案

    java中的ProcessBuilder提供了一种执行外部OS命令的方法,并通过管道输入和读取外部命令的输出。下面是一个这样做的示例:

    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
            }
        }
    }