Java - 在程序仍在运行时使用exec和read输出

时间:2016-08-08 04:16:29

标签: java

所以我在Java中为exe创建了一个gui。有点麻烦,但我很努力。由于这个程序是一个控制台程序,我需要在程序运行时读取程序的输出并将其放入Swing文本框中。但我尝试过的每一种方式要么不稳定,要么完全不起作用。任何人都可以帮我解决这个问题吗?注意我已经尝试过Apache Commons exec但收效甚微。此外,我正在尝试制作这种跨平台并创建了一种获取操作系统的方法:

public enum OSType {
    WINDOWS, OSX, LINUX, DAFUQ
}

/**
 * Gets OS running on then caches result
 * @return OS running on
 **/
public static OSType getOS() {
    if (os != null)
        return os;
    else {
        os = getOperatingSystem();
        return os;
    }
}

/** Don't use this! Use {@link Frame#getOS()} instead **/
public static OSType getOperatingSystem() {
    String OS = System.getProperty("os.name").toLowerCase();
    if (OS.indexOf("win") >= 0)
        return OSType.WINDOWS;
    else if (OS.indexOf("mac") >= 0)
        return OSType.OSX;
    else if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0)
        return OSType.LINUX;
    else
        return OSType.DAFUQ;
}

修改

为了澄清,我正在创建一个.jar程序,它充当了EXE的gui。这是我目前正在尝试使用的代码来启动程序:

ProcessBuilder prc = new ProcessBuilder(commands);

        prc.redirectErrorStream(true);

        try {
            Frame.exec = prc.start();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

commands变量只是我需要执行的命令的列表。程序运行正常,因为我可以看到它在任务管理器上工作。这里也是我从进程的InputStream中读取的代码:

BufferedReader in = new BufferedReader(new InputStreamReader(exec.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

我试图异步读取流,所以这段代码在另一个线程中,这就是为什么我需要存储" exec"变量

1 个答案:

答案 0 :(得分:0)

  

我试图从ProcessBuilder获取但是它等到程序关闭才能读取控制台输出。

不,不。它会在写入后立即读取所写的内容。您所看到的是缓冲输出在子进程中的效果,可能是stdio。如果您无法控制该流程的代码,那么您无能为力。