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