参加过校园招聘机试的你, 在CSDN、力扣、牛客网上做过编程题目的你,
肯定都有过在一个web页面输入代码,得到执行结果的经历。 聪明如你,有没有想过这种在线编程系统(OJ)是怎么实现的呢?
最近,笔者要做的一项工作是,编写各种demo程序、辅以各种JVM参数测试给出JDK1.8各种参数的建议值。要求给出在linux物理机、虚拟机和docker下的对比测试结果。
接到这个工作后,初步的计划是在windows上写程序,打个jar包,然后放在linux物理机、虚拟机和docker上分别测试。
完成两个demo后,发现这么做的工作量实在太大了,常用JVM参数就有数十个,每个参数都得测试,每个参数编译个jar包,不知道这个工作要做到何年何月。
于是,一个想法产生了, 能不能只编写一次程序,然后一直测试?
很自然地想起了那些经历过的在线编程系统。 这类系统是如何实现的呢?
其实,仔细想想很简单,Java代码得到结果不就是编译、运行两步么? 简单设计下原型:
实现过程中基本没遇上什么难度,
关键代码:
第一步编译:
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界面:
运行结果:
构造出错场景
1.编译异常:
2、运行异常:
功能实现难度不大,但是过程还是挺有意思的,感兴趣的可以自行从我github下载完整代码查看
总结
其实无论是生活还是开发中,原以为很困难的事情,只要细心分析可能发现也就是分为几步而已,把大象装冰箱不也就三步而已,定个一亿的小目标,兴许也能实现呢?
今天多学一样本事,以后就少说一句求人的话,
你我皆加油!