零开始怎样上手获取所需知识
一直想为大创项目添加在线编程功能,但是时间原因一直未能践行。尽管如今在线编译运行功能已经不再稀奇,但貌似未能找到相关教程,只好自己花时间进行研究尝试。注:在线判题类似,暂时只做在线编译运行。
程序运行无非就是两个步骤:编译+运行(不是指那种解释型语言你懂的),像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(