如何使用Java来编译运行C文件(二)
前言
上一篇博文我啰嗦了那么久,就是为了要交代清楚前期准备,现在我们就来正式开始动工。注意,本文代码较多,而且略微冗长,毕竟是测试用的,就没考虑那么多了。主体功能实现了,剩下的小细节可以自己慢慢优化。
批处理文件
先填补上一篇博文剩下的坑。
稍微解释一下情景,我想要cd
到E盘,然后调用gcc
来编译.c
文件,可惜搜索借用网上关于使用&&
来连接多条cmd
语句不能成功,暂时我只想到利用批处理文件来实现这个功能了。
后缀名为.bat的文件,会被系统自动编译为批处理文件。*.bat 文件中输入,就相当于在dos 窗口中输入一样, 编辑完成后,双击即可运行。
临时变量:在批处理文件 中设置临时变量方式:`set 变量名=变量值`, = 左右不要有空格,使用方式: %变量名% 即可。
批处理文件执行完之后,窗口会自动关闭;若想执行完之后,窗口不自动关闭的话,在文件末尾添加 pause 即可。
调用批处理文件来实现编译
Runtime run = Runtime.getRuntime();
String filePath = "bat文件绝对地址";
Process p = run.exec("cmd.exe /c " + filePath);
//这样子就实现了java调用执行多条cmd语句
编译C源文件
将.bat
文件与.c
文件放于同一目录之下,调用Runtime.getRuntime().exec()
来执行编译功能。
对于编译来说,只要是获取有可能的错误提示,通过不断接收我们开启的进程的getErrorStream()
来获得编译的错误提示。
注意,这里没有涉及到我们构建的进程(会有三条不同的流:标准输入流、标准输出流、错误输入流)多条流之间的交互关系,所以理论上不需要使用waitFor()
来获取结果。但在运行过程中就不得不使用这个方法来堵塞进程。
waitFor()
容易导致死锁的发生!
static Process c;
/**
* 通过 Runtime 调用批处理文件来编译编源文件
* 注意:批处理文件需要与编译源文件位于同一目录下
* @param filePath 批处理文件的绝对路径
* @throws FileNotFoundException 找不到
*/
static public void compileApplication(String filePath) throws FileNotFoundException {
Runtime run = Runtime.getRuntime();
String cPath = filePath.replace("bat", "c");
File batFile = new File(filePath);
File cFile = new File(cPath);
if(!cFile.exists()){
throw new FileNotFoundException("找不到c编译源文件!");
}
if(batFile.exists()) {
try {
c = run.exec("cmd.exe /c " + filePath);
InputStream in = c.getInputStream();
BufferedInputStream errorIn = new BufferedInputStream(c.getErrorStream());