我们在之前的操作中已经拿到程序进行了编译和运行
接下来我们要将我们的结果输出
整理输出
// 4.收集整理输出结果
ExecuteCodeResponse executeCodeResponse = new ExecuteCodeResponse();
ArrayList<String> outputList = new ArrayList<>();
for (ExecuteMessage executeMessage : executeMessageList) {
String errorMessage = executeMessage.getErrorMessage();
if(StrUtil.isBlank(errorMessage)){
executeCodeResponse.setMessage(errorMessage);
// 执行中存在错误
executeCodeResponse.setStatus(3);
break;
}
outputList.add(executeMessage.getMessage());
}
if(outputList.size()==executeMessageList.size()){
executeCodeResponse.setStatus(1);
}
// 组装信息
executeCodeResponse.setOutputList(outputList);
JudgeInfo judgeInfo = new JudgeInfo();
executeCodeResponse.setJudgeInfo(judgeInfo);
// 5.文件清理
// 6.错误处理 提升程序的健壮性
return executeCodeResponse;
这边使用的是spring的stopwatch类
来获取一段程序的执行时间
接下来我们要尝试获取程序执行时间
接下来我们尝试去获得运行内存
这个非常麻烦 要借助第三方库
我们可以用windows自带的一个程序去计算
此处我们使用最大值来统计时间 便于后续判题服务计算程序是否超时
// 3.执行代码 获得输出结果
List<ExecuteMessage> executeMessageList = new ArrayList<>();
for (String inputArgs : inputList) {
StopWatch stopWatch = new StopWatch();
String runCmd = String.format("java -Dfile.encoding=UTF-8 -cp %s Main 1 3", userCodeParentPath, inputArgs);
try {
stopWatch.start();
Process runProcess = Runtime.getRuntime().exec(runCmd);
// 等待程序执行 获取错误码
ExecuteMessage runExecuteMessage = ProcessUtils.runProcessAndGetMessage(runProcess, "运行");
System.out.println(runExecuteMessage);
executeMessageList.add(runExecuteMessage);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 4.收集整理输出结果
ExecuteCodeResponse executeCodeResponse = new ExecuteCodeResponse();
List<String> outputList = new ArrayList<>();
// 取用时最大值 便于判断是否超时
long maxTime = 0 ;
for (ExecuteMessage executeMessage : executeMessageList) {
String errorMessage = executeMessage.getErrorMessage();
if(StrUtil.isNotBlank(errorMessage)){
executeCodeResponse.setMessage(errorMessage);
// 执行中存在错误
executeCodeResponse.setStatus(3);
break;
}
outputList.add(executeMessage.getMessage());
Long time =executeMessage.getTime();
if(time !=null){
maxTime=Math.max(maxTime,time);
}
}
接下来我们要进行代码文件回收处理
就是把我们已经生成的文件给删除掉
这边写一个异常
让刚才的抛出异常的地方全部return就行
/**
* 获取错误响应
* @param throwable
* @return ExecuteCodeResponse
*/
private ExecuteCodeResponse getErrorResponse(Throwable throwable){
ExecuteCodeResponse executeCodeResponse = new ExecuteCodeResponse();
executeCodeResponse.setOutputList(new ArrayList<>());
executeCodeResponse.setMessage(e.getMessage());
// 表示代码沙箱错误
executeCodeResponse.setStatus(2);
executeCodeResponse.setJudgeInfo(new JudgeInfo());
return executeCodeResponse;
}