- 浏览: 32694 次
- 性别:
- 来自: 南京
最新评论
有很多网站提供在线编译运行java代码,不过大家要做好安全工作,防止恶意浏览者攻击,下面做一个雏形,欢迎大家改进
来源:http://www.shangxueba.com/jingyan/1860918.html
public class CompileAndRunJavaFile extends HttpServlet{ private static Process process ;//执行子进程 /** * 编译并且运行JAVA代码 * @author Maple */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String code = req.getParameter("code");//获取页面参数 String className = null; //类名 String classStr = null; BufferedWriter bw = null; try{ classStr = code.substring(code.indexOf("public class"),code.indexOf("{")).toString();//获取类名字符串 String[] classStrArray = classStr.split("\\s{1,}");//按空格分开 if(classStrArray.length!=3){ req.setAttribute("msg", "编译失败:格式不符合规范,请检查类名是否正确(如:public class YouClassName{})"); } else{ className = classStrArray[classStrArray.length-1]; File sourceFile = new File(className+".java");//保存源代码 if(sourceFile.exists()){ sourceFile.delete(); } FileWriter fr = new FileWriter(sourceFile); bw = new BufferedWriter(fr); bw.write(code); bw.close(); fr.close(); Runtime runtime = Runtime.getRuntime(); process = runtime.exec("cmd"); Thread.sleep(1000);//防止cmd.exe程序未启动,当然也可以直接使用javac命令 //往控制台注入命令 bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); bw.write("javac "+className+".java \n"); bw.flush(); long startFreeMemory = runtime.freeMemory();//Java 虚拟机中的空闲内存量 //执行时间也是无法知道,因为dos执行java命令,程序无法知道它到底执行到那里了,两个进程,互不了解 long startCurrentTime = System.currentTimeMillis();//获取系统当前时间 bw.write("java "+className+" \n"); bw.close(); //获取控制台输出的结果 Thread runtimeInput = new Thread(new RuntimeInput()); runtimeInput.start(); //获取内存信息,实际过程中,是无法得到这个程序到底多少内存,内存的分配有操作系统决定,如果 //程序需要,系统会动态分配内存,如果有对象没有引用,可能会被垃圾回收器回收,所以是无法得到到底多少内存的 //如果你有办法知道,可以留言,现在得到程序运行前后内存使用率,不过输出的是0,因为程序退出,不占内存了 Thread.sleep(1000); long endCurrentTime = System.currentTimeMillis(); long endFreeMemory = runtime.freeMemory(); double useMemory = (startFreeMemory-endFreeMemory)/1024; System.out.println("开始时间:"+startCurrentTime); System.out.println("结束时间:"+endCurrentTime); long useTime = endCurrentTime-startCurrentTime; req.setAttribute("msg","编译成功,使用时间:"+useTime+"毫秒");//这个使用时间是大概的,不精确 } } catch(Exception e){ e.printStackTrace(); req.setAttribute("msg", "格式不符合规范,请检查类名是否正确(如:public class YouClassName{}).错误信息:"+e.getMessage()); } req.getRequestDispatcher("/test.jsp").forward(req, resp); } public class RuntimeInput implements Runnable{ @Override public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String content = null; try { while((content = br.readLine()) != null){ System.out.println(content);//如果想把结果输出到页面,直接定义变量就行 } } catch (IOException e) { e.printStackTrace(); } } } } public class CompileAndRunJavaFile extends HttpServlet{ private static Process process ;//执行子进程 /** * 编译并且运行JAVA代码 * @author Maple */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String code = req.getParameter("code");//获取页面参数 String className = null; //类名 String classStr = null; BufferedWriter bw = null; try{ classStr = code.substring(code.indexOf("public class"),code.indexOf("{")).toString();//获取类名字符串 String[] classStrArray = classStr.split("\\s{1,}");//按空格分开 if(classStrArray.length!=3){ req.setAttribute("msg", "编译失败:格式不符合规范,请检查类名是否正确(如:public class YouClassName{})"); } else{ className = classStrArray[classStrArray.length-1]; File sourceFile = new File(className+".java");//保存源代码 if(sourceFile.exists()){ sourceFile.delete(); } FileWriter fr = new FileWriter(sourceFile); bw = new BufferedWriter(fr); bw.write(code); bw.close(); fr.close(); Runtime runtime = Runtime.getRuntime(); process = runtime.exec("cmd"); Thread.sleep(1000);//防止cmd.exe程序未启动,当然也可以直接使用javac命令 //往控制台注入命令 bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); bw.write("javac "+className+".java \n"); bw.flush(); long startFreeMemory = runtime.freeMemory();//Java 虚拟机中的空闲内存量 //执行时间也是无法知道,因为dos执行java命令,程序无法知道它到底执行到那里了,两个进程,互不了解 long startCurrentTime = System.currentTimeMillis();//获取系统当前时间 bw.write("java "+className+" \n"); bw.close(); //获取控制台输出的结果 Thread runtimeInput = new Thread(new RuntimeInput()); runtimeInput.start(); //获取内存信息,实际过程中,是无法得到这个程序到底多少内存,内存的分配有操作系统决定,如果 //程序需要,系统会动态分配内存,如果有对象没有引用,可能会被垃圾回收器回收,所以是无法得到到底多少内存的 //如果你有办法知道,可以留言,现在得到程序运行前后内存使用率,不过输出的是0,因为程序退出,不占内存了 Thread.sleep(1000); long endCurrentTime = System.currentTimeMillis(); long endFreeMemory = runtime.freeMemory(); double useMemory = (startFreeMemory-endFreeMemory)/1024; System.out.println("开始时间:"+startCurrentTime); System.out.println("结束时间:"+endCurrentTime); long useTime = endCurrentTime-startCurrentTime; req.setAttribute("msg","编译成功,使用时间:"+useTime+"毫秒");//这个使用时间是大概的,不精确 } } catch(Exception e){ e.printStackTrace(); req.setAttribute("msg", "格式不符合规范,请检查类名是否正确(如:public class YouClassName{}).错误信息:"+e.getMessage()); } req.getRequestDispatcher("/test.jsp").forward(req, resp); } public class RuntimeInput implements Runnable{ @Override public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String content = null; try { while((content = br.readLine()) != null){ System.out.println(content);//如果想把结果输出到页面,直接定义变量就行 } } catch (IOException e) { e.printStackTrace(); } } } }
来源:http://www.shangxueba.com/jingyan/1860918.html
发表评论
-
javaTrim方法扩展:Trim掉指定字符
2017-01-04 09:45 566public static String myTrim(Str ... -
Java中使用C3P0连接池
2017-01-03 16:09 3181、c3p0.properties c3p0.driv ... -
Java四种线程池的使用
2016-12-23 17:25 465Java通过Executors提供四种线程池,分别为: new ... -
jvm内存分析
2016-12-23 09:26 362http://www.cnblogs.com/ITtangta ... -
面向对象三大基本特性,五大基本原则
2016-12-18 21:40 282透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. ... -
接口和抽象类有什么区别
2016-12-18 21:38 377接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? ... -
多线程轮流打印递增的数字
2016-12-18 21:28 619问题的描述 启动3个线程打印递增的数字, 线程1先打印1,2 ... -
使用Java线程并发库实现两个线程交替打印的线程题
2016-12-12 11:22 469背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一 ... -
推荐书目与知识点记录
2016-12-08 19:38 3561、Java序列化 2、线程通信:比如最简单的2个线程轮流 ... -
maven初次使用问题记录
2016-03-15 21:59 425【1】下载安装 下载的免安装版本,直接配置maven_ho ... -
eclipse远程调试Tomcat方法
2016-03-15 19:18 5131、Linux中配置tomcat在catalina.sh中添 ... -
Excel导入MySql数据库批量操作
2015-12-31 10:07 1620最近在帮朋友做一个计时提醒系统,大致业务如下: 某 ...
相关推荐
java模拟编译器,实现词法,语法分析,生成语法树
java实验tiger语言编译 内有实验报告。 是一款模拟编译器
编译原理课程PJ。
基于Java语言和java图形界面,将C语言的基础语法经过词法分析,语法分析,语义处理翻译为中间代码四元式,再将四元式翻译为标准JVM虚拟机的字节码bytecode,模拟JVM虚拟机实现一个CVM虚拟机,并运行该程序。
MiniJava编译器 专为课程设计的Mini Java编译器
完整的编译器实现,包括词法分析器、语法分析器、语义分析器的完整代码实现,文件中包含相应的文法。根据这些文件可以实现完整的小型编译器了。费了好大劲写的,多要点分了。
A、Java编译器将源文件编译为二进制的目标码文件 B、连接软件将目标码文件连接为最终的执行文件 C、Java虚拟机运行连接后的可执行文件,将它们翻译为硬件能够理解的机器语言 D、目标码无需连接,可以直接由Java...
资源包含可运行的java代码,以及sample.txt(二进制源文件)作为输入测试用例。运行结果为解析后的汇编代码,和模拟出来的每个周期的寄存器状态。
完全由Java构建的项目,通过对源代码的词法分析(将字符流转化成令牌),使用OOP在Java虚拟机上模拟源代码的编译,然后使用递归下降处理对其进行解析。 这些标记放在抽象语法树上,然后由类型检查约束,并引用符号表...
西电软院大三编译原理大作业(基于java实现的C语言编译器),同时包含课件、往年真题+源代码+文档说明+模拟试题+pdf+答案 - 小白不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的课程设计,代码都...
操作系统课设OS-基于Java实现的可视化模拟文件系统,实现了进程管理、内存管理、设备调度、磁盘调度、文件系统、编译器系统等功能 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都...
适用于Java的官方LESS CSS编译器最新版本1.7.0.1.1-与1.7.0或更低版本兼容的1.1版本用于Java的LESS CSS编译器是一个用于将LESS源编译为CSS样式表的库。 该编译器使用Rhino,Envjs(用JavaScript编写的模拟浏览器环境...
健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用...
PL/O 语言编译器程序,本程序分为三个部分,分别实现了词法分析、语法分析和目标代码生成,并且给出了中间代码生成的结果,可以进行模拟仿真。本程序使用JAVA编写,可以防止eclipse中直接运行。
java编译器针对JVM产生的class文件,因此是独立于平台的;java解释器负责将java虚拟机的代码在特定的平台上运行 3、GC:不再使用的内存空间应该回收----垃圾收集;在C和C++等语言中,是由程序员自己回收垃圾释放...
此转编译器不会尝试模拟 JVM,但会产生接近原始 Java 源代码的人类友好输出(与基于 LLVM 的解决方案不同)。 它支持高达 Java 9 的任何 Java 版本作为源代码,并生成 PHP 7 代码。 这是一个处于早期阶段的实验项目...
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean...JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。...
java实现的汉诺塔算法,能够实现自动移动(一次只移动一个,只能是大盘再下)。为了看清楚每次移动的细节,默认一秒移动一个盘。你可以将压缩包解压导入java编译器,运行Test.java类(主类)即可。
此系统是使用Java语言实现简易写字板程序,能够进行输入文字操作,...源码都是经过本人亲测的,都是完整可运行的,对于源码本身大家不必担心,用idea或eclipse或者myeclipse,只要是java专用的编译器都是可以运行起来的