背景及效果
考試又考試,考試何其多
天天為考試,萬事成蹉跎
學子皆被分數累,春去秋來沒快樂
朝聞老師吼,暮聞家長火
一生考試苦幾何,請君聽我考試歌
暑假前有個同學要上機考日語,然而對於他這種連書的目錄都沒看過的人,考試,呵呵。

於是我就搞出了這個小工具。一般上機考試都是會提前發題庫的,他只需要在考試的時候把題庫復制到考試電腦上一份,把程序打成包,雙擊后台運行就好了。效果就是復制題目,然后粘貼直接出答案。


代碼思路
復制的內容會存放到電腦剪切板,通過代碼從剪切板拿到復制的內容,然后讀題庫,一行一行去比對,看是否包含拿到的詞條,如果匹配成功那么就把對應的題目放入剪切板,這樣再粘貼就是粘貼出的答案。以下為具體細節:
- 先得到剪切板,隨便放點內容進去,防止程序第一次運行時,匹配的時候出現空指針異常
- 運行程序后,操作者會復制題目,復制的題目會保存進剪切板
- 開始死循環,讓程序一直運行着
- 死循環內部,從剪切板拿到復制的題目
- 讀取題庫,一行一行的對比
- 當發現讀到的當前行題目和得到的剪切板里的題目一致時,把對應的答案放入剪切板
- 這時再粘貼就會出現答案
源碼
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)這個方法,是從內容對象中去得到字符串部分。因為復制的時候我們可以復制任何東西,所以代碼這里在獲取內容的時候可以通過格式匹配來獲取指定格式的內容。
裝逼時刻
視頻不好放,演示效果參考上面的動圖。不過有了這個小東西后,那個同學上機日語考試十五分鍾就交卷了。考完試他對我的崇拜就像這樣。哈哈哈哈哈哈哈啊哈

咳咳,這里要聲明一下啊,我們只是在交流技術而已,你們不要學壞哦!


