CompreT.java为原代码
程序运行时,需要将整个formssi文件夹拷贝到D盘的根目录
//选择题文件所在位置
private static final String selectFiles = "D:/formssi/java/test/select/title" ;
//选择题答案位置
private static final String AselectFiles = "D:/formssi/java/test/select/answer" ;
//填空题文件所在位置
private static final String vacantFiles = "D:/formssi/java/test/vacant/title" ;
//填空题答案位置
private static final String AvacantFiles = "D:/formssi/java/test/vacant/answer" ;
//程序题文件所在位置
private static final String programFiles = "D:/formssi/java/test/program/title" ;
//程序题答案位置
private static final String AprogramFiles = "D:/formssi/java/test/program/answer" ;
//试卷位置
private static final String testFile = "D:/formssi/java/test/testFile.txt" ;
//试卷答案位置
private static final String AtestFile = "D:/formssi/java/test/AtestFile.txt" ;
该出题系统支持扩展题源
package com.formssi.test3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/*
* 随机生成题目
*/
public class CompreT {
//选择题文件所在位置
private static final String selectFiles = "D:/formssi/java/test/select/title" ;
//选择题答案位置
private static final String AselectFiles = "D:/formssi/java/test/select/answer" ;
//填空题文件所在位置
private static final String vacantFiles = "D:/formssi/java/test/vacant/title" ;
//填空题答案位置
private static final String AvacantFiles = "D:/formssi/java/test/vacant/answer" ;
//程序题文件所在位置
private static final String programFiles = "D:/formssi/java/test/program/title" ;
//程序题答案位置
private static final String AprogramFiles = "D:/formssi/java/test/program/answer" ;
//试卷位置
private static final String testFile = "D:/formssi/java/test/testFile.txt" ;
//试卷答案位置
private static final String AtestFile = "D:/formssi/java/test/AtestFile.txt" ;
//
//读取文件数
public static int readFilesNum(String files) {
File file = new File(files);
if (file.exists() && file.isDirectory() ) {
return file.list().length;
}else {
throw new RuntimeException("找不到文件"+files);
}
}
//生成一组不同的随机数
/*
* num 生成数量
* max 取值范围
*/
public static int[] mainRs(int num,int max) {
//Set中不允许有重复值
Set<Integer> sIntegers = new HashSet<>();
while (sIntegers.size() < num){
sIntegers.add((int) ((Math.random()*max+1)));
}
int[] n = new int[num];
int i=0;
for(Integer it:sIntegers){
n[i++] = it;
}
return n;
}
public static void main(String[] args) {
//检测环境
//删除原有的试卷和答案
deleteFile(testFile);
deleteFile(AtestFile);
//生成选择题
buildTitle("一,选择题:", selectFiles, AselectFiles);
//生成填空题
buildTitle("二,填空题:", vacantFiles, AvacantFiles);
//生成程序题
buildTitle("三,程序题:", programFiles, AprogramFiles);
}
/*
* 删除文件
*/
public static void deleteFile(String fileName) {
File file = new File(fileName);
if (file.exists() && file.isFile()) {
file.delete();
}
}
/*
* 生成题目试卷与答案
*/
public static void buildTitle(String title,String srcFiles,
String AsrcFiles) {
buildTitle(title, srcFiles, testFile, AsrcFiles, AtestFile);
}
/*
* 生成题目试卷与答案
* title 那种类型的题目
* srcFiles 题目源
* desFile 题目目标文件所在
* AsrcFiles 答案源
* AdesFile 答案目标文件
*/
public static void buildTitle(String title,String srcFiles,String desFile,
String AsrcFiles,String AdesFile) {
Scanner scanner = new Scanner(System.in);
//1.接收该生成的题数目
int max = readFilesNum(srcFiles);
System.out.println("请输入"+title+"数目,但不大于"+max);
int num = scanner.nextInt();
while (num > max ) {
System.out.println("请重新输入");
num = scanner.nextInt();
}
//2.应该生成的题目数量
int[] ints = mainRs(num, max);
//3.通过生成的题目读取文件并写入试卷
try {
//写入之前先写入大题目与答案题目
writeLine(title, AdesFile);
writeLine(title, desFile);
//生成试卷和答案
writeFile(ints, srcFiles, desFile);
writeFile(ints, AsrcFiles, AdesFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 写入一行信息
*/
public static void writeLine(String title,String desFile) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(desFile,true));
writer.write(title);
writer.newLine();
writer.flush();
writer.close();
}
/*
* 将多个文件输出到一个文件中
* ints 文件具体名
* srcFiles 源文件夹
* desFile 目标文件
*/
public static void writeFile(int[] ints,String srcFiles,String desFile) throws IOException {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fos = null;
PrintWriter pw = null;
int t = 1; //文件内容名
for(int i : ints){
try {
File file = new File(srcFiles+"/"+i+".txt");//文件路径(包括文件名称)
//将文件读入输入流
fis = new FileInputStream(file);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
//文件输出流
fos = new FileOutputStream(desFile,true);
pw = new PrintWriter(fos,true); //true代表不是覆盖操作
//首先写进内容名
pw.write(""+(t++)+".");
pw.flush(); //刷新;
String str;
while((str = br.readLine()) != null)
{
pw.write(str);
pw.println(); //换行;
pw.flush(); //刷新;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
//不要忘记关闭
if (pw != null) {
pw.close();
}
if (fos != null) {
fos.close();
}
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (fis != null) {
fis.close();
}
}
}
}
}