Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在程序仍在运行时使用exec和read输出_Java - Fatal编程技术网

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

Java-在程序仍在运行时使用exec和read输出,java,Java,因此,我正在为Java中的exe创建gui。有点麻烦,但我正在努力。由于这个程序是一个控制台程序,我需要在程序运行时读取程序的输出,并将其放入Swing文本框中。但我尝试过的每一种方法要么不稳定,要么根本不起作用。有人能帮我解决这个问题吗?注意:我尝试过ApacheCommonsExec,但几乎没有成功。此外,我还尝试实现跨平台,并创建了一种获取操作系统的方法: public enum OSType { WINDOWS, OSX, LINUX, DAFUQ } /** * Gets

因此,我正在为Java中的exe创建gui。有点麻烦,但我正在努力。由于这个程序是一个控制台程序,我需要在程序运行时读取程序的输出,并将其放入Swing文本框中。但我尝试过的每一种方法要么不稳定,要么根本不起作用。有人能帮我解决这个问题吗?注意:我尝试过ApacheCommonsExec,但几乎没有成功。此外,我还尝试实现跨平台,并创建了一种获取操作系统的方法:

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”变量的原因

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

不,没有。写了什么就读什么。您看到的是在子进程中缓冲输出的效果,可能是通过
stdio
。如果您无法控制该流程的代码,那么您对此无能为力

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


不,没有。写了什么就读什么。您看到的是在子进程中缓冲输出的效果,可能是通过
stdio
。如果您无法控制该进程的代码,那么您对此无能为力。

您真的是在说:您正在编写一个java应用程序(您希望将其部署为二进制EXE);您的java代码正在写入system.out;现在你想做什么?要获取输出并将其放入UI元素中吗?这有一个标准模式,还有几个DUP,但我现在似乎找不到它们。基本要求是一个线程向进程“
stdin
”提供输入,一个线程从进程“
stdout/stderr
”读取输出,以及在进程退出后清理主线程。使用
ProcessBuilder
启动外部可执行文件。顺便说一句,你真正启动这个过程的代码在哪里?因此,我正在部署一个.jar文件,它在后台运行一个exe,然后将控制台输出作为仍在运行的文件。我试图从ProcessBuilder获取,但它要等到程序关闭后才能读取控制台输出。我会在一秒钟内得到代码,但它确实是不完整的,因为我不得不删除它来尝试其他方法。如果底层启动的可执行文件没有刷新缓冲区,那么您就无能为力了。你知道它是否真的存在吗?你真的是在说:你正在编写一个java应用程序(你想将其部署为二进制EXE);您的java代码正在写入system.out;现在你想做什么?要获取输出并将其放入UI元素中吗?这有一个标准模式,还有几个DUP,但我现在似乎找不到它们。基本要求是一个线程向进程“
stdin
”提供输入,一个线程从进程“
stdout/stderr
”读取输出,以及在进程退出后清理主线程。使用
ProcessBuilder
启动外部可执行文件。顺便说一句,你真正启动这个过程的代码在哪里?因此,我正在部署一个.jar文件,它在后台运行一个exe,然后将控制台输出作为仍在运行的文件。我试图从ProcessBuilder获取,但它要等到程序关闭后才能读取控制台输出。我会在一秒钟内得到代码,但它确实是不完整的,因为我不得不删除它来尝试其他方法。如果底层启动的可执行文件没有刷新缓冲区,那么您就无能为力了。你知道是不是吗?我确实可以查到消息来源。我可以修改它使它工作吗?@DanielPickering这就是你要找的吗?(假设底层可执行文件是用C.编写的):@Siguza I将设置开发环境,但它可能会工作。谢谢你的链接。我确实可以访问源代码。我可以修改它使它工作吗?@DanielPickering这就是你要找的吗?(假设底层可执行文件是用C.编写的):@Siguza I将设置开发环境,但它可能会工作。谢谢你的链接。