cmd在打开java时立即打开和关闭

cmd在打开java时立即打开和关闭,java,cmd,Java,Cmd,我正在使用Java为Java源文件创建一个代码编辑器。当我点击RUN菜单时,它会完美地打开cmd并运行javac命令,但问题是它会立即关闭,我需要暂停之类的操作 这是我的代码: Runtime rt = Runtime.getRuntime(); try { rt.exec("cmd.exe /c start java Maq"); } catch (IOException e1) { e1.printStackTrace(); } 如何解决这个问题?命令的“开始”位将Java

我正在使用Java为Java源文件创建一个代码编辑器。当我点击
RUN
菜单时,它会完美地打开
cmd
并运行
javac
命令,但问题是它会立即关闭,我需要暂停之类的操作

这是我的代码:

Runtime rt = Runtime.getRuntime();
try {
    rt.exec("cmd.exe /c start java Maq");
} catch (IOException e1) {
    e1.printStackTrace();
}

如何解决这个问题?

命令的“开始”位将Java与cmd进程分离

您最好编写一个包含以下内容的批处理脚本:

@echo off
java Maq
pause
ProcessBuilder pb = new ProcessBuilder("javac", "Maq.java");
pb.directory(new File("/path/to/source/code/"));

Process p = pb.start();
InputStream in = p.getInputStream(); // this is connected to the System.out from javac
int exit = p.waitFor(); // wait for javac to finish

StringBuilder text = new StringBuilder();
char[] buf = new char[1024]; int read;
while ((read = in.read(buf)) != -1)
    text.append(new String(buf, 0, read));
text.append("\n\njavac returned with exit code ").append(exit);

// display text - it now contains javac's output and its exit code
JFrame f = new JFrame("javac's output");
JTextPane tp = new JTextPane();
tp.setText(text.toString());
tp.setEditable(false);
f.setContentPane(tp);
f.setSize(500, 400); // or whatever
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);

然后只需使用Runtime.exec(…)调用批处理文件

即可查看
javac
的输出,您不能使用
Runtime.exec()。改用a。您的代码可以如下所示:

@echo off
java Maq
pause
ProcessBuilder pb = new ProcessBuilder("javac", "Maq.java");
pb.directory(new File("/path/to/source/code/"));

Process p = pb.start();
InputStream in = p.getInputStream(); // this is connected to the System.out from javac
int exit = p.waitFor(); // wait for javac to finish

StringBuilder text = new StringBuilder();
char[] buf = new char[1024]; int read;
while ((read = in.read(buf)) != -1)
    text.append(new String(buf, 0, read));
text.append("\n\njavac returned with exit code ").append(exit);

// display text - it now contains javac's output and its exit code
JFrame f = new JFrame("javac's output");
JTextPane tp = new JTextPane();
tp.setText(text.toString());
tp.setEditable(false);
f.setContentPane(tp);
f.setSize(500, 400); // or whatever
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);

既然您已经确认确实需要javac并且正在使用IDE/编辑器,那么处理编译错误的正确方法是使用
javax.tools.JavaCompiler
从JRE编译

JavaCompiler
为您提供了完善的控制和跨平台功能,并且始终存在。你可以看一看,让自己开始。下面是它的用法

我个人曾将其用于类似IDE的项目,它完全符合您对程序内编译器的期望。

问题的回答帮助了我:)


Javac?但是在你的代码中你有java命令吗?解释一下你的意思是什么pause@shazinjavac和java相同:Dbut我的代码编辑器可能有多个选项卡,因此shld i每次都会为evry选项卡创建一个批处理文件来运行它们??默认情况下,java是独立于操作系统的,这也是非常糟糕的做法(没有参数…)maq,您可以在批处理脚本中使用参数。但是msrd0是正确的,我完全同意他的观点,尽管当涉及诸如cmd.exe之类的东西时,Runtime.exec调用不是跨平台的。正确的解决方案是使用Java的流程功能,或者正如我作为新答案发布的那样,使用内置的compiler@maq为什么不创建一个带有
JTextPane
(或类似)的
JFrame
,并显示其中的文本?@maq请查看我的编辑,javac从未要求输入,我明白了,但很抱歉,我没有提到我还希望
java
命令run@maq在
JTextPane
下面添加一个
JTextField
来实现这一点怎么样?@maq没有那么复杂(如果您愿意,我可以提供代码),但是如果您正在寻找依赖操作系统的解决方案,按照Mitchell的建议编写批处理脚本