几行代码实现一个叙利亚版的OJ系统

简介: 参加过校园招聘机试的你, 在CSDN、力扣、牛客网上做过编程题目的你,肯定都有过在一个web页面输入代码,得到执行结果的经历。 聪明如你,有没有想过这种在线编程系统(OJ)是怎么实现的呢?

参加过校园招聘机试的你, 在CSDN、力扣、牛客网上做过编程题目的你,

肯定都有过在一个web页面输入代码,得到执行结果的经历。 聪明如你,有没有想过这种在线编程系统(OJ)是怎么实现的呢?


最近,笔者要做的一项工作是,编写各种demo程序、辅以各种JVM参数测试给出JDK1.8各种参数的建议值。要求给出在linux物理机、虚拟机和docker下的对比测试结果。

接到这个工作后,初步的计划是在windows上写程序,打个jar包,然后放在linux物理机、虚拟机和docker上分别测试。


完成两个demo后,发现这么做的工作量实在太大了,常用JVM参数就有数十个,每个参数都得测试,每个参数编译个jar包,不知道这个工作要做到何年何月。


于是,一个想法产生了, 能不能只编写一次程序,然后一直测试?


很自然地想起了那些经历过的在线编程系统。 这类系统是如何实现的呢?

其实,仔细想想很简单,Java代码得到结果不就是编译、运行两步么? 简单设计下原型:

image.png

实现过程中基本没遇上什么难度,

关键代码:


第一步编译:


ProcessBuilder pb = new ProcessBuilder();
//编译文件
pb.command("javac", "-encoding" ,"UTF-8", programInfo.getFileName() + ".java");
pb.directory(new File(programInfo.getFilePath()));
Process compileProcess = pb.start();
int compileStatus = compileProcess.waitFor();
//编译出错
if (compileStatus != 0) {
    String insResult = getResult(compileProcess.getInputStream());
    String errorResult = getResult(compileProcess.getErrorStream());
    return insResult + errorResult;
}


第二步运行:


构造用户输入的运行参数

//构造运行时命令
List<String> commands = new ArrayList<>();
commands.add("java");
if (jvmparas != null) {
    String[] paras = jvmparas.toString().split("\n");
    for (String para : paras) {
        if (para != null) {
            commands.add(para.trim());
        }
    }
}


执行代码


commands.add("TestFile");
ProcessBuilder execPb = new ProcessBuilder();
execPb.command(commands);
execPb.directory(new File(programInfo.getFilePath()));
Process execProcess = execPb.start();
compileProcess.waitFor();
//把结果返回给界面
return  getResult(execProcess.getInputStream())+ getResult(execProcess.getErrorStream());


叙利亚风格UI界面:


image.png


运行结果:


image.png


构造出错场景


1.编译异常:


image.png


2、运行异常:


image.png

功能实现难度不大,但是过程还是挺有意思的,感兴趣的可以自行从我github下载完整代码查看


总结


其实无论是生活还是开发中,原以为很困难的事情,只要细心分析可能发现也就是分为几步而已,把大象装冰箱不也就三步而已,定个一亿的小目标,兴许也能实现呢?

今天多学一样本事,以后就少说一句求人的话,

你我皆加油!


目录
相关文章
|
6月前
|
人工智能 自然语言处理 监控
保姆级教程:OpenClaw阿里云/本地MacOS/Lunix/Windows部署+免费大模型API配置+集成100个精选Skills指南
OpenClaw(昵称“龙虾”)凭借灵活的Skills扩展机制,在AI与Web3圈持续升温,其核心魅力在于通过“动态工具箱”模式,让AI根据任务自动调用对应工具,既减少算力浪费,又避免运行卡顿。但截至2026年3月,ClawHub社区已收录超过1.3万个Skills,质量参差不齐,新手极易陷入“盲目安装、无用堆砌”的困境,最终让OpenClaw沦为摆设。
3946 15
|
8月前
|
人工智能
【AI实训营限时开启】一句话生成高转化直播话术,边学边赚好礼!
只需一句话就能生成专属高转化直播话术,助您轻松成单,GMV翻倍增长。完成任务将有好礼可以领取哦!
242 3
|
6月前
|
人工智能 自然语言处理 安全
新手15分钟上手!OpenClaw阿里云部署教程(含API配置+常见问题排查)
2026年,AI自动化工具迎来全民普及,OpenClaw(前身为Clawdbot、Moltbot)凭借“自然语言指令驱动+全场景任务自动化”的核心优势,成为个人与轻量团队搭建专属AI助手的首选。这款开源工具无需手动编写脚本,仅需输入口语化指令,即可完成文档处理、文件管理、代码生成、跨工具协同等重复性工作,堪称“7×24小时在线的私人AI员工”。
1613 6
|
存储 Java 测试技术
ClickHouse Keeper: 一个用 C++ 编写的 ZooKeeper 替代品
ClickHouse Keeper: 一个用 C++ 编写的 ZooKeeper 替代品介绍
71842 34
ClickHouse Keeper: 一个用 C++ 编写的 ZooKeeper 替代品
|
前端开发 数据可视化 JavaScript
🚀打造卓越 UI:2024 年不容错过的 9 个 React UI 组件库✨
本文介绍了2024年最受欢迎的9个React UI组件库,每一个都在设计、功能和定制化上有独特的优势,包括Material UI、Ant Design、Chakra UI等。这些组件库为开发者提供了强大、灵活的工具,可以帮助构建现代化、无障碍且高效的Web应用程序。文章详细分析了每个库的特点、适用场景以及关键功能,帮助开发者在项目中做出最合适的选择,无论是打造企业级仪表板还是时尚的用户界面。
2984 6
🚀打造卓越 UI:2024 年不容错过的 9 个 React UI 组件库✨
|
安全 网络安全 数据安全/隐私保护
http原理
http原理
316 4
|
弹性计算 Linux 开发工具
阿里云 ECS 挂载数据盘 以及 重启后挂载的盘还原成了未挂载
如果需要将数据盘挂载到 /home/mysqldata 目录下,之前是在 /home/mysqldata 目录下的,先执行 umount /dev/vdb1 目录卸载挂载的数据盘,然后执行 mount /dev/vdb1 /home/mysqldata 命令,重新将数据盘挂载到 /home/mysqldata 目录下。
2008 1
阿里云 ECS 挂载数据盘 以及 重启后挂载的盘还原成了未挂载
|
前端开发 Java
SpringBoot——SpringBoot集成jsp
SpringBoot——SpringBoot集成jsp
SpringBoot——SpringBoot集成jsp

热门文章

最新文章