【发布时间】: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