背景及效果
考试又考试,考试何其多
天天为考试,万事成蹉跎
学子皆被分数累,春去秋来没快乐
朝闻老师吼,暮闻家长火
一生考试苦几何,请君听我考试歌
暑假前有个同学要上机考日语,然而对于他这种连书的目录都没看过的人,考试,呵呵。
于是我就搞出了这个小工具。一般上机考试都是会提前发题库的,他只需要在考试的时候把题库复制到考试电脑上一份,把程序打成包,双击后台运行就好了。效果就是复制题目,然后粘贴直接出答案。
代码思路
复制的内容会存放到电脑剪切板,通过代码从剪切板拿到复制的内容,然后读题库,一行一行去比对,看是否包含拿到的词条,如果匹配成功那么就把对应的题目放入剪切板,这样再粘贴就是粘贴出的答案。以下为具体细节:
- 先得到剪切板,随便放点内容进去,防止程序第一次运行时,匹配的时候出现空指针异常
- 运行程序后,操作者会复制题目,复制的题目会保存进剪切板
- 开始死循环,让程序一直运行着
- 死循环内部,从剪切板拿到复制的题目
- 读取题库,一行一行的对比
- 当发现读到的当前行题目和得到的剪切板里的题目一致时,把对应的答案放入剪切板
- 这时再粘贴就会出现答案
源码
public static void main(String[] args) throws Exception { /* * 得到系统剪切板,并定义一个字符串放入剪切板,该字符串的目的是为了让剪切板里有点东西,防止在刚运行程序时包空指针异常 */ //得到剪切板 Clipboard clipoard = Toolkit.getDefaultToolkit().getSystemClipboard(); //随便定义个字符串,StringSelection是剪切板可识别的字符串格式 StringSelection temp = new StringSelection("aaa"); //通过剪切板的set方法将上述字段添加进剪切板 clipoard.setContents(temp, null); /* * 死循环,保证程序一直运行着 * 从剪切板中拿到复制的内容 * 读取题库文件,一行一行比对 * 如果发现该行内容包含复制的词条,那么匹配成功,把该行内容中的答案部分添加进剪切板 */ while(true) { //得到剪切板中的内容模块 Transferable transferable = clipoard.getContents(null); //从中匹配字符串格式,得到剪切板中的文字 String search = (String)transferable.getTransferData(DataFlavor.stringFlavor); //读入题库文件 Scanner scanner = new Scanner(new File("d:/task.txt")); //按行读取文件 while (scanner.hasNext()) { String context = scanner.nextLine(); //判断改行是否包含搜索的词条 if(context.contains(search)) { //如果包含,将改行冒号后的部分也就是答案部分放入剪切板 StringSelection selection = new StringSelection(context.split(":")[1]); clipoard.setContents(selection, null); } } //休眠一秒,防止频繁调用剪切板系统报错 Thread.sleep(1000); } }
难点讲解
因为这里用scanner按行读取的文件,所以在编辑题库的时候最好一道题一行,然后题目和答案之间用某个符号来做关联,方便截取答案。我是用英文冒号做的关联,所以取答案的时候用context.split(":")[1]来截取
Transferable是剪切板的内容类,获取的东西是剪切板里的所有内容,包含字符串、图片、文件的各种格式。利用 (String)transferable.getTransferData(DataFlavor.stringFlavor)这个方法,是从内容对象中去得到字符串部分。因为复制的时候我们可以复制任何东西,所以代码这里在获取内容的时候可以通过格式匹配来获取指定格式的内容。
装逼时刻
视频不好放,演示效果参考上面的动图。不过有了这个小东西后,那个同学上机日语考试十五分钟就交卷了。考完试他对我的崇拜就像这样。哈哈哈哈哈哈哈啊哈
咳咳,这里要声明一下啊,我们只是在交流技术而已,你们不要学坏哦!