如何使用Java来编译运行C文件(二)

这篇博文详细介绍了如何使用Java来编译和运行C语言文件,包括创建批处理文件、编译C源文件和运行exe文件的过程。文章强调了在运行exe文件时可能遇到的死锁问题,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何使用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());
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值