【问题标题】:Java - Use exec and read output while program is still runningJava - 在程序仍在运行时使用 exec 并读取输出
【发布时间】:2016-08-08 04:16:28
【问题描述】:

所以我正在为 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”变量的原因。

【问题讨论】:

  • 你真的是在说:你正在编写一个 java应用程序(你想部署为二进制EXE);并且您的 java 代码正在写入 system.out;现在你想做什么?获取该输出并将其放入 UI 元素中?
  • 有一个标准模式,并且在 SO 上有几个重复,但我现在似乎找不到它们。基本要求是一个线程将输入提供给进程'stdin,一个线程从进程读取输出'stdout/stderr,以及在进程退出后清理主线程。使用ProcessBuilder 启动外部可执行文件。顺便说一句,实际启动该进程的代码在哪里?
  • 所以我正在部署一个 .jar 文件,该文件在后台运行一个 exe,然后在它仍在运行时获取控制台输出。我试图从 ProcessBuilder 获取,但它会等到程序关闭才能读取控制台输出。我会在几秒钟内得到代码,但它确实不完整,因为我不得不将其删除以尝试其他方法。
  • 如果底层启动的可执行文件没有刷新缓冲区,那么您无能为力。你知道有没有?

标签: java


【解决方案1】:

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

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

【讨论】:

  • 我确实可以访问源代码。我可以修改它以使其正常工作吗?
  • @DanielPickering 这就是您要找的东西吗? (假设底层可执行文件是用 C 编写的...):stackoverflow.com/q/259355
  • @Siguza 我将设置开发环境,但它可能会工作。感谢您的链接。
猜你喜欢
  • 1970-01-01
  • 2015-02-19
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多