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

一直想为大创项目添加在线编程功能,但是时间原因一直未能践行。尽管如今在线编译运行功能已经不再稀奇,但貌似未能找到相关教程,只好自己花时间进行研究尝试。注:在线判题类似,暂时只做在线编译运行。
程序运行无非就是两个步骤:编译+运行(不是指那种解释型语言你懂的),像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(new InputStreamReader(process.getInputStream(), "GBK"));while((line=stdoutFrom.readLine())!=null)stdout+=line+"\n";stdoutFrom.close();;}if(stderrB){BufferedReader stdoutFrom=new BufferedReader(new InputStreamReader(process.getErrorStream(), "GBK"));while((line=stdoutFrom.readLine())!=null) {re+=line+"\n";}stdoutFrom.close();}//exec 执行过程是异步的,waitfor会阻塞主进程,直到子进程完毕int exitCode=process.waitFor();answer.setError(exitCode);answer.setStderr(re);answer.setStdout(stdout);return answer;}catch (IOException |InterruptedException e){e.printStackTrace();}answer.setError(2);return answer;}
}

响应结果实体类

package bean;
public class Answer {//错误码如果error为0表示运行ok,1为编译错误,2为命令运行出错…………很多很多状态private int error;//出错的提示信息-运行成功-编译错误-运行时错误。private String reason;public static String Success="运行成功";public static String Error="编译错误";public static String RuntimeError="运行时错误";//运行程序得到的标准输出private String stdout;//运行程序得到的标准错误private String stderr;public int getError() {return error;}public void setError(int error) {this.error = error;}public String getReason() {return reason;}public void setReason(String reason) {this.reason = reason;}public String getStdout() {return stdout;}public void setStdout(String stdout) {this.stdout = stdout;}public String getStderr() {return stderr;}public void setStderr(String stderr) {this.stderr = stderr;}
}

主程序

import bean.Answer;
import java.io.*;
public class Test {public static void main(String[] args) throws IOException {String DIR="d:/javaTest/";String javaFile=DIR+"Main.java";String javaClass="Main";String compileCmd=String.format("javac -encoding utf8 %s -d %s",javaFile,DIR);String runningCmd=String.format("java -classpath %s %s", DIR, javaClass);String doc="public class Main {\n" +"    public static void main(String[] args) {\n" +"        System.out.println(\"hello world\");\n" +"    }\n" +"}";//将代码写入到定义路径下特定的java源文件中FileWriter writer=new FileWriter(javaFile);writer.write(doc);writer.close();//编译源文件为class文件Answer answer=ExecUtil.run(compileCmd,false,true);System.out.println(answer.getStderr());//若编译成功即可开始运行if(answer.getError()==0) {answer = ExecUtil.run(runningCmd, true, true);if(answer.getError()!=0)answer.setReason(Answer.Success);elseanswer.setReason(Answer.RuntimeError);System.out.println(answer.getStdout());}elseanswer.setReason(Answer.Error);}
}

运行代码可发现输出了Hello Word,证明demo运行成功!

下一步

第一个Demo已经完成,下一步就可以将其集成到Web项目环境中,编写网络接口了。之后还有许多问题待解决,如:

  1. 怎么在并发环境下编译运行(文件名随机,可行吗?)
  2. 还要控制线程数,防止OOM
  3. 程序运行超时(死循环)怎么处理
  4. 可能用户会提交危害系统的代码怎样隔离环境或者屏蔽处理……
  5. 编译环境,服务器一个一个装?

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

  1. java实现代码在线编译器-从零开发(二)简单SpringBoot网络接口demo

    新建SpringBoot项目 其他语言其他框架也差不多,简单入门写个网络接口还是很快的. 配置文件: server:servlet:context-path: /port: 8080 工程目录: Te ...

  2. java实现代码在线编译器-从零开发(三)Web并发环境下的线程安全

    并发环境下会出现什么问题? 上一篇已经测试过,单个请求是能正常执行并且返回的.但是,系统部署在公网上往往不可能一个人使用,因此必须经过并发测试,不求多规范,至少简单的并发测试也是要进行的. Apifo ...

  3. 圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单

    圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单 // //  CircleCore.h //  Quartz // //  Created by 仙人掌 on ...

  4. java springboot VUE 在线学习平台系统开发mysql数据库web结构java编程计算机网页源码maven项目前后端分离

    一.源码特点   springboot VUE 在线学习平台系统是一套完善的完整信息管理类型系统 前后端分离,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系 ...

  5. 记录一下很好用的java爬虫代码-很有意思,原理也很简单,一看就懂

    **主要功能是:**爬取百度图片中的图片,一键下载 功能就是这样,根据输入的关键字不同,自动下载不同的图片,当然,这些图片都是从百度图片中爬取出来的. 思路 随便输入一个关键字,百度图片就会展示出很多 ...

  6. Saiku二次开发获取源代码在本地编译(五)

    关于Saiku的二次开发,在本地编译然后启动自己编译好的Saiku服务 Saiku是开源的,从github上能下载源代码,本例中的saiku源码也是从github上找的,然后自己改了一些pom.xml ...

  7. java离线编译_离线代码编译器用吐了,那这五款在线编译器你可以来试试了。...

    在云计算时代,使用旧的离线编译器和IDE并不是那么无聊.当然离线是很棒的,但是我们必须在每种系统上手动安装不同的编译器,这需要很大的空间,而且要将代码移植到多个系统上也不容易.但是使用在线编译器或ID ...

  8. 如何从零开发一个低代码平台,有哪些成熟技术组件可用

    目前国内主流的低代码开发平台有:宜搭.云程.简道云.明道云.氚云.伙伴云.道一云.JEPaaS.华炎魔方.搭搭云.JeecgBoot .RuoYi等.这些平台各有优劣势,定位也不同,用户可以根据自己需 ...

  9. 使用Java在线编译器手搓一款摸鱼小游戏

    这其实是一篇摸鱼指南. 这篇文章主要是学习如何使用Java在线编译器在浏览器中制作一个 猜数字的小游戏 ,真的只需要有网+有浏览器就可以.想学习Java编程的小伙伴可以静下来认真学习,纯粹想摸鱼的小伙 ...

  10. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. javafx 使用_何时使用JavaFX代替HTML
  2. 2019.3.23 捕获异常
  3. C++ static静态成员变量
  4. php scrscriptipt,XSS挑战之旅闯关笔记
  5. tapable 创建钩子
  6. k8s 命令 重启_k8s基本命令
  7. 增强 for 循环 和 普通for 循环的 区别总结
  8. python 解压缩字符串_在C中压缩字符串,在python中解压缩
  9. gdiplus 水印_GDIPlus合成半透明图片批量添加图片水印
  10. android 9 one ui,终于!三星S9系列国行开测安卓9.0系统:OneUI真香!
  11. MVCC(多版本并发控制)原理
  12. c语言函数字符传送,C语言中send()函数和sendto()函数的使用方法
  13. 北漂人的独白,是否有所共鸣
  14. linux打开nginx配置文件,【linux】systemctl启动nginx没有加载nginx.conf配置文件?
  15. STM32芯片数据手册下载——官网免费下载方法
  16. 红米4刷linux,极客精神,国外大神将红米Note 7刷上了Ubuntu
  17. 上传App Store的截图尺寸
  18. 半球展开图_新手入门如何学习钣金放样展开,老师傅分享篇(二)!
  19. P1941 [NOIP2014 提高组] 飞扬的小鸟
  20. 如何把 html、js、css 等一个 html 网页打包成单一的 exe 可执行程序文件?

热门文章

  1. 挑战程序设计竞赛(第2版)
  2. route命令(详细)
  3. WindowsXP相关设置对应的注册表位置
  4. 【Axure图标库】单线形图标元件库 细线矢量图标1000+
  5. WEB前端(4)—— CSS经典案例(DIV+CSS布局)
  6. 基于java 海康视频监控 jar包运行
  7. 俄罗斯方块源代码 java_俄罗斯方块 Java程序源代码 在eclipse上运行
  8. 单片机编程软件很简单(24),keil单片机编程软件仿真、调试技巧+常见错误
  9. Mars3D基础学习:地图控件
  10. SQL Server 2012基本介绍