在线OJ系统--第一章(实现java编译运行过程)

在线OJ(一)

目标:仿照牛客/leetcode这类在线OJ网站,实现在线做题/判题功能

核心功能

  1. 题目列表页,展示当前系统中所有的题目。
  2. 题目详情页,显示题目的具体要求和代码模板,提供一个编辑框供用户来编辑代码。
  3. 代码的编译/运行/测试功能,能够针对用户提交的代码,进行编译运行,并自动执行测试用例,返回测试结果。

编译模块:给定一个java代码文件(只考虑单个文件的情况,不考虑多文件复杂工程)能够通过代码来控制jdk进行编译运行。通过借助Runtime这个对象,可以创建出一个子进程,并且让子进程来执行一个相关的命令。编译:javac,运行:java

进程与线程

进程是资源分配的基本单位。

线程是CPU调度和执行的基本单位

线程相比于进程的优势:

1.线程更轻量,创建一个线程开销比创建进程低很多;销毁一个线程的开销也比销毁一个进程开销低很多。

2.同一个进程中的所有线程共享着一些数据。

线程相比于进程的劣势:

1.线程代码编写更困难,涉及线程安全。

2.线程代码调试也更加困难。

3.对于程序的稳定性也就提出了更高要求。

CommandUtil

如何利用子进程来执行命令?接下来就是对CommandUtil的讲解,其本质就是利用了jdk的Runtime对象。

在这里插入图片描述

exec方法干了两件事:1.创建子进程。2.进程程序替换

在这里插入图片描述

这里的运行结果实际上是父进程的输出结果,那么如果我们想要获取子进程的输出结果就需要使用到“重定向”功能,把进程输出的内容写到指定的文件中。具体实现:实现重定向,需要先获取到子进程对象,借助exec返回的Process对象,通过标准输入输出来重定向保存子进程输出结果。

在这里插入图片描述

执行结果发现:文件是有了,但是内容没有,为什么?因为一个命令的输出内容也可能是通过标准错误来打印的。操作系统中的任何一个进程,启动的时候都会自动打开三个文件:标准输入、标准输出、标准错误。并通过文件管理的方式,将其组织起来。我们只需要将上图第三步复制,修改为标准错误重定向就好了(process.getErrStream())。

在这里插入图片描述

执行结果:

首先,生成了两个对应的文件。

在这里插入图片描述

第二,在stderrFile.txt文件中可以看到内容,也就是我们在cmd中直接输入javac的内容。

在这里插入图片描述

当然,我们还需要考虑一件事,本身预期目标是用父进程中的run方法来控制子进程执行功能。在执行run的过程中,子进程也在执行。当run执行结束之后,也必须确保子进程也已经执行完了。但是此时这个代码中,子进程和父进程之间是并发关系,谁先执行完时无法确定的,为了能够明确让子进程先执行完,就需要让父进程进行等待。

在这里插入图片描述

CommandUtil代码

import java.io.*;

// 借助这个类,让java代码能够去执行一个具体的指令
// 例如:javac Test.java
public class CommandUtil {
   
    //cmd 表示要执行的命令
    //stdoutFile 表示标准输出结果重定向到哪个文件中,如果为null表示不需要重定向
    //stderrFile 表示标准错误结果重定向到哪个文件中。
    public static int run(String cmd,String stdoutFile,String stderrFile) throws IOException, InterruptedException {
   
        //1.获取Runtime对象  ,Runtime对象是一个单例的
        Runtime runtime = Runtime.getRuntime();
        //2.通过runtime对象中的exec方法来执行一个指令。
        // 相当于在命令行中输入了命令
        // 获取exec返回的Process对象
        Process process = runtime.exec(cmd);
        //3.通过标准输入输出对输出结果进行重定向保存
        if(stdoutFile != null){
   
            //进程的标准输出中的结果就可以通过这个InputStream来获取
            InputStream stdoutFrom = process.getInputStream();
            OutputStream stdoutTo = new FileOutputStream(stdoutFile);
            int ch = -1;
            while((ch = stdoutFrom.read()) != -1){
   
                stdoutTo.write(ch);
            }
            stdoutFrom.close();
            stdoutTo.close();
        }
        //4.针对标准错误也进行重定向
        if(stderrFile != null){
   
            InputStream stderrFrom = process.getErrorStream();
            OutputStream stderrTo = new FileOutputStream(stderrFile);
            int ch = -
最低0.47元/天 解锁文章
OnlineJudge大集合
weixin_30432007的博客
11-02 3800
什么是OJ Online Judge系统(简称OJ)是一个在线的判题系统。用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序...
在线OJ系统
qq_44762389的博客
08-10 1700
在线OJ系统 模块划分: 在线译器模块 题目管理模块 在线编译器模块 将代码通过网页提交到服务器上 使用第三方库 cpp-httplib 搭建http服务器 调用gcc、g++编译代码
【项目篇1】一个在线OJ系统
weixin_56738054的博客
04-13 3437
回顾一下我们常见的OJ平台,例如:leetcode,牛客等等,他们都有哪些功能?
在线评测系统oj系统安装
03-29
oj系统安装过程,所有命令需要手打,发出来仅仅是为了大家一起讨论,一起进步,如有侵权,请及时通知我,我会立刻将文件删除,敬请谅解,!
OJ —— Online Judge
Edward2022的博客
03-17 1081
OJ介绍、OJ网站推荐
leetcode下载-Java_OJ-:基于Java语言实现在线OJ项目
06-29
Java_OJ- 项目介绍 功能简介 模仿 Leetcode 和牛客网的在线OJ功能,实现的一个基于Java语言使用者的在线OJ项目。 核心功能 展示题目库中所有题目 对某一题目进行详细展示 对用户提交的代码进行编译运行 功能模块 ...
基于Java的实训在线OJ系统安卓端设计源码
最新发布
03-29
这是一个基于Java的实训在线OJ系统安卓端设计,使用JavaJavaScript、HTML和CSS语言开发,包含147个文件。...该项目是一个实训作业,旨在创建一个支持安卓访问的在线OJ系统,适合用于个人学习和实践Java的开发技术。
OJ系统汇总-2021-10-5(C)-32页.pdf
10-05
OJ系统汇总-2021-10-5(C)-32页.pdf
OJ系统汇总-2021-10-5(B).pdf
10-05
OJ系统汇总-2021-10-5(B).pdf
编程语言 Java 实现在线 OJ 系统
03-01
内容概要:基于 Servlet 实现在线 OJ 系统,包含题目的列表页和题目详情页,类似于leetcode,可以在线编辑代码,提交代码并对用户提交的代码进行编译运行,返回运行结果或错误信息 适合人群:初学 Java 的 ...
Java项目】 在线OJ系统
zhangxxin的博客
08-19 1150
目录项目简介1.项目实现步骤1.1数据库的创建1.2创建数据库工具类Util1.3创建能够实现运行命令的类CommandUtil1.4创建生成目录以及构造指令的类Task1.5创建数据库的实体类Problem以及数据库操作类ProblemDAO1.6 创建Servlet代码1.7代码中用到的一些文件操作工具类2 项目测试2.1插入数据测试2.2删除数据测试2.3 查询所有题目列表2.4 查询题目详情 项目简介 在线OJ系统就是大家平时刷题的网站,比如力扣,我的这个系统就是模仿力扣网站做了一个简单的OJ系统
简易oj系统实现
weixin_45802297的博客
03-03 2282
简易oj系统实现 一、题目: 某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。例子可见下方的样例输入与输出部分。 二、输入: 输入数据包含多行,第一行是题数n(1...
实战项目--在线OJ系统(1)
qq_41181857的博客
07-12 1736
项目需求 模拟力扣实现一个在线编译器: 基本框架 在线编译器 把网页上代码内容提交到服务器上,进行编译运行,提交 题目管理 管理当前系统上所有的OJ题目,能够和网页进行交互,获取所有的题目列表以及某个题目详情 代码实现 #pragma once #include<stdint.h> #include<iostream> #include<cstdlib> #include<string> #include<sys/time.h> //时间戳
我的OJ系统
qq_45313714的博客
08-19 406
啦啦啦/。。
毕设项目:基于BS模型的在线OJ系统
森明帮大于黑虎帮的博客
03-25 3010
系列文章目录 文章目录系列文章目录前言一、在线OJ系统描述二、在线编译模块1.获取到要编译的代码生成临时文件2.调用g++进行编译,把编译结果记录到临时文件中3.运行可执行程序,执行测试用例代码,把运行结果也记录到临时文件4.把运行结果打包成最终的响应数据,并返回来三、题目管理模块1.题目是如何存储2.总结 前言 一、在线OJ系统描述 在线OJ系统类似于力扣或者牛客网的核心部分刷题代码练习功能,提供了用户一个可以在线刷题编写代码并且能够进行编译运行的环境,题目通过序号排序,题目也有难度等级的划分,测.
在线OJ系统--第二章(业务层编写)
zSoaring的博客
03-01 1062
主要是将后端逻辑完善
在线OJ——牛客网
xiaobai
05-14 4773
目录 项目简述 项目核心功能 核心功能介绍 项目改进 项目简述 模拟实现牛客网、leetcode题目管理和在线编译等功能 项目核心功能 在线编译 题目管理 核心功能介绍 在线编译 获取要编译的代码临时文件 调用g++进行编译,记录编译结果到临时文件 运行可执行程序,执行测试用例,记录执行结果 将临时文件结果打包,响应用户 题目管理(通过文件管理,后续MySQL管理)...
杭电oj1000-1100
11-10
杭州电子科技大学在线评测系统(杭电OJ)中的题目1000-1100是一系列编程题,我将分别进行回答。 1000题是一个简单的入门题,要求计算两个整数的和。我们可以使用一个简单的算法,读取输入的两个整数,然后将它们相加,最后输出结果即可。 1001题是一个稍微复杂一些的题目,要求实现字符串的逆序输出。我们可以使用一个循环来逐个读取输入的字符,然后将这些字符存储在一个数组中。最后,我们可以倒序遍历数组并将字符依次输出,实现字符串的逆序输出。 1002题是一个求最大公约数的问题。我们可以使用辗转相除法来解决,即先求出两个数的余数,然后将被除数更新为除数,将除数更新为余数,直至两个数的余数为0。最后的被除数就是最大公约数。 1003题是一个比较简单的排序问题。我们可以使用冒泡排序算法来解决,即每次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。重复这个过程直至整个数组有序。 1100题是一个动态规划问题,要求计算给定序列中的最长上升子序列的长度。我们可以使用一个数组dp来保存到达每个位置的最长上升子序列的长度。每当遍历到一个位置时,我们可以将其和之前的位置比较,如果比之前位置的值大,则将其更新为之前位置的值加1,最后返回dp数组的最大值即可。 以上是对杭电OJ1000-1100题目的简要回答,涉及了一些基本的编程知识和算法思想。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • C语言实现三子棋(详解) 5543
  • A New Beginning 2914
  • 用扑克游戏操练List常用方法 2155
  • Java程序逻辑控制,刷完这些你就懂了 1837
  • 关于Arrays.sort()的使用方式 1540

分类专栏

  • 数据结构 7篇
  • 在线OJ系统 2篇
  • Mybatis 5篇
  • Spring 3篇
  • 程序人生 1篇
  • LeetCode疯狂练 6篇
  • Mysql 5篇
  • 多线程 3篇
  • Java 8篇
  • javaWeb 1篇
  • C语言 3篇

最新评论

  • 一道题检测多线程基本功!(顺序打印ABC)

    我懂了→: <三个线程 分别打印ABC. >

  • C语言实现三子棋(详解)

    学Java的冬瓜: 很细,支持

  • 复习-图(非邻接表和邻接矩阵的存储方式和相关算法)

    应钟二十六: 好棒!表情包

  • C语言实现三子棋(详解)

    Cristiano777.: 支持大佬

  • C语言实现三子棋(详解)

    謓泽: 表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 复习-图(非邻接表和邻接矩阵的存储方式和相关算法)
  • 复习-排序
  • 在线OJ系统--第二章(业务层编写)
2022年4篇
2021年29篇
2020年11篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司芜湖网站推广公司渭南网站制作保定网站改版哪家好怀化设计公司网站恩施网络推广价格延安SEO按天计费报价昌都营销型网站建设宝安英文网站建设多少钱惠州设计网站哪家好台州英文网站建设报价池州网站制作多少钱绍兴网站排名优化价格北京网站推广方案哪家好潜江网站优化软件推荐东营外贸网站建设公司金华SEO按天计费合肥SEO按天扣费价格崇左网页制作公司三亚网站优化报价商洛SEO按天收费周口企业网站制作推荐抚顺百度标王哪家好马鞍山网站关键词优化价格绍兴网站优化按天计费公司泰安建站推荐松岗百度网站优化淮安百度爱采购昌都阿里店铺托管哪家好木棉湾如何制作网站哪家好喀什建网站多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化