源码:JAVA在线编译器模拟


有很多网站提供在线编译运行java代码,不过大家要做好安全工作,防止恶意浏览者攻击,下面做一个雏形,欢迎大家改进

[java]

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;www.2cto.com
   try {
    while((content = br.readLine()) != null){
      System.out.println(content);//如果想把结果输出到页面,直接定义变量就行
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }

}


作者:mzlqh
原文链接:http://www.2cto.com/kf/201206/136672.html

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值