java实现代码在线编译器-从零开发(一)简单本地编译+运行测试

本文介绍了如何从零开始开发一个简单的Java在线编译器,通过Runtime.exec()方法实现编译和运行。文章提供了一个基础的Demo,包括工具类、响应结果实体类和主程序,成功输出了'Hello World',并讨论了后续集成到Web项目及面临的问题,如并发编译、资源控制和安全性等。

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

零开始怎样上手获取所需知识

一直想为大创项目添加在线编程功能,但是时间原因一直未能践行。尽管如今在线编译运行功能已经不再稀奇,但貌似未能找到相关教程,只好自己花时间进行研究尝试。注:在线判题类似,暂时只做在线编译运行。
程序运行无非就是两个步骤:编译+运行(不是指那种解释型语言你懂的),像html、js能直接在浏览器运行的,无需后端编译环境。本例以Java为例编译(javac)+运行(java)

思路:搜索(项目所用为Java)如何运行系统命令,很容易找到Runtime,通过Runtime.getRuntime() 可以返回与当前 Java 应用程序相关的运行时对象。接着去搜索会发现它的exec()可以调用外部命令

关于exec()返回结果类型:Process,它有几个方法:

1.destroy():杀掉子进程
2.exitValue():返回子进程的出口值,值 0 表示正常终止
3.getErrorStream():获取子进程的错误流
4.getInputStream():获取子进程的输入流
5.getOutputStream():获取子进程的输出流
6.waitFor():导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0 表示正常终止

大体思路有了,只需要定义好编译命令+运行命令扔到Runtime.getRuntime().exec()就能简单地实现程序的编译运行了。

第一个Demo

当然是来一个经典的Hello Word!了(先不管输入数据,只考虑输出流和错误流)。先封装一个工具类,方便之后反复调用,以及一个响应结果类Answer

工具类

/**
 * @Author deng
 * @Date 2022/3/1 0:52
 */
import bean.Answer;
import java.io.*;

public class ExecUtil {
   
    //1.通过Runtime类得到实例,执行exec方法
    //2.希望获取到标准输出,并写入到指定的文件中
    //3.获取到标准的错误,并写入到指定文件中
    //4.等待子进程结束,拿到状态码,并返回。

    //防止不小心实例化工具类
    private ExecUtil(){
   }
    public static Answer run(String cmd,Boolean stdoutB,Boolean stderrB){
   
        //System.out.println(cmd);
        Answer answer=new Answer();
        try {
   
            //1.通过Runtime类得到实例,执行exec方法
            Process process=Runtime.getRuntime().exec(cmd);
            //2.获取到标准输出,并写入到指定文件中
            String line="",re="",stdout="";
            if(stdoutB){
   
                //windows上指定GBK中文才能正常显示,Linux还没试明先不管
                //也会自动阻塞
                BufferedReader stdoutFrom=new BufferedReader(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值