1

我的程序要求我运行一个 .bat 文件,该文件将编译 java 源代码。这运行良好,但是我正在寻找一种解决方案,它将获取 compile.bat 的输出(和可能的错误)并将其添加到 GUI 上的文本窗格中。我有以下代码,但是当执行该过程时,不会在窗格中打印任何内容,也不会出现任何错误。

GenerationDebugWindow.main(null);

Process process = rut.exec(new String[] {file.getAbsolutePath() + "\\compile.bat"});
Scanner input = new Scanner(process.getInputStream());

InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);

String line;
int exit = -1;

while ((line = reader.readLine()) != null) {
    // Outputs your process execution
    try {
        exit = process.exitValue();
        GenerationDebugWindow.writeToPane(line);
        System.out.println(line);
        if (exit == 0)  {
            GenerationDebugWindow.writeToPane("Compilation Finished!");
            if(new File(file + "/mod_" + WindowMain.modName.getText()).exists()){
                GenerationDebugWindow.writeToPane("Compilation May Have Experienced Errors.");
            }
        }
    } catch (IllegalThreadStateException t) {

    }
}

生成调试窗口

private static JTextPane outputPane;
public static void writeToPane(String i){
    outputPane.setText(outputPane.getText() + i + "\r\n");
}
4

3 回答 3

2

采用:

Runtime.getRuntime().exec( "cmd.exe /C " + file.getAbsolutePath() + "\\compile.bat" );
于 2012-07-21T00:45:34.043 回答
1

参考这个问题: Java Process with Input/Output Stream

进程的输出很可能会进入错误流。但是,ProcessBuilder 是一个比直接使用 System.getRuntime().exec() 更有用的类

在下面的示例中,我们告诉 ProcessBuilder 将错误流重定向到与输出相同的流,这简化了代码。

ProcessBuilder builder = new ProcessBuilder("cmd.exe /C " + file.getAbsolutePath() + "\\compile.bat");
builder.redirectErrorStream(true);
builder.directory(executionDirectory); // if you want to run from a specific directory
Process process = builder.start();
Reader reader = ...;
String line = null;
while ((line = reader.readLine ()) != null) {
    System.out.println ("Stdout: " + line);
}

int exitValue = process.exitValue();
于 2012-07-21T00:47:09.593 回答
0

我的程序要求我运行一个 .bat 文件,该文件将编译 java 源代码。

您在 *nix 和 OS X 上的用户要求使用JavaCompiler.

STBC是使用JavaCompiler. 它是开源的。它使用 aJTextArea而不是 aJTextPane来保存源和错误,但应该很容易适应。

编译错误 编译成功

于 2012-07-21T02:47:44.153 回答