-----------------2018.2.9----------------
问过女王大人,她说多线程对单例模式的Runtime的争夺不会影响到对C文件的编译结果。
process.waitFor()的作用是啥?
今天没啥进度。一份乱七八糟只有我本人才能看懂的半成品如下。明天需要打磨它,搞搞C的文件操作,并复习Thread的概念。
package cn.edu.nju.zyf.cmddemo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class ThreadDemo {
public static void main(String[] args) {
Process process = null;
try {
BufferedReader br1 = null;
BufferedReader br2 = null;
//假设学号.c文件从学生处来,caller.c文件从老师处来。
//TODO 第一步,编译连接学生的程序与老师的main(该main位于/caller)
String compileCommand = "gcc d:\\gcc-workspace\\MF1732202.c d:\\gcc-workspace\\caller\\caller.c -o d:\\gcc-workspace\\test_result\\MF1732202\\hehehe411.exe";
process = Runtime.getRuntime().exec(compileCommand);
process.waitFor();
br1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String infoLine = null;
String errorLine = null;
String infoMessage = "";
String errorMessage = "";
File infoFile = new File("D:\\gcc-workspace\\test_result\\MF1732202\\INFO.txt");
File errorFile = new File("D:\\gcc-workspace\\test_result\\MF1732202\\ERROR.txt");
FileWriter infoFileWriter = new FileWriter(infoFile);
FileWriter errorFileWriter = new FileWriter(errorFile);
while((infoLine = br1.readLine())!=null) {
System.out.println(infoLine);
infoMessage = infoMessage + infoLine+"\n";
}
infoFileWriter.write(infoMessage);
while((errorLine = br2.readLine())!=null) {
System.out.println(errorLine);
errorMessage = errorMessage + errorLine+"\n";
}
errorFileWriter.write(errorMessage);
br1.close();
br2.close();
infoFileWriter.close();
errorFileWriter.close();
System.out.println(process.exitValue());
if(process.exitValue()!=0) {
return;
}
//第二步,跑一下那个生成的exe。该动作会产生result.txt
System.out.println("Here is step 2");
String runCommand = "d:\\gcc-workspace\\test_result\\MF1732202\\hehehe411";
process = Runtime.getRuntime().exec(runCommand);
//process.waitFor();//我也不知道为什么要注释掉这一行,但是注释掉它之后功能就有了……否则功能就体现不出来……
//TODO 第三步,使用java,将D:\gcc-workspace\test_case\output.txt的内容与D:\gcc-workspace\test_result\MF1732202\result.txt的内容进行逐行对比,并将分数写入分数文件
//一定需要修改。
System.out.println("Here is step 3");
String type = "double";//当参数
int numOfTestCases = 3;//当参数
File expected = new File("D:\\gcc-workspace\\test_case\\output.txt");
File actual = new File("D:\\gcc-workspace\\test_result\\MF1732202\\result.txt");
Reader expectedReader = new FileReader(expected);
Reader actualReader = new FileReader(actual);
BufferedReader expectedBufferedReader = new BufferedReader(expectedReader);
BufferedReader actualBufferedReader = new BufferedReader(actualReader);
int same = 0;
if(type.equals("double")) {
for(int i = 0;i<numOfTestCases;i++) {
String expectedLine = expectedBufferedReader.readLine();
String actualLine = actualBufferedReader.readLine();
double expectedResult = Double.parseDouble(expectedLine);
double actualResult = Double.parseDouble(actualLine);
if(Math.abs(expectedResult-actualResult)<1e-4) {
same++;
}
}
}
if(type.equals("string")) {
for(int i = 0;i<numOfTestCases;i++) {
String expectedLine = expectedBufferedReader.readLine();
String actualLine = actualBufferedReader.readLine();
if(expectedLine.equals(actualLine)) {
same++;
}
}
}
if(type.equals("int")) {
for(int i = 0;i<numOfTestCases;i++) {
String expectedLine = expectedBufferedReader.readLine();
String actualLine = actualBufferedReader.readLine();
if(expectedLine.equals(actualLine)) {
same++;
}
}
}
expectedBufferedReader.close();
actualBufferedReader.close();
expectedReader.close();
actualReader.close();
double score = ((double)same/(double)numOfTestCases)*100.0;
File scoreFile = new File("D:\\gcc-workspace\\test_result\\MF1732202\\score.txt");
FileWriter scoreFileWriter = new FileWriter(scoreFile);
scoreFileWriter.write(score+"");
scoreFileWriter.close();
//TODO 第四步,将正常信息、错误信息和得分传输到数据库
//先搁置。等设计好数据库再说吧……
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("Here is finally");
if(process!=null) {
process.destroy();
}
}
}
}