目錄html
考慮到此次的任務是實現本身的命令行命令cp,我認爲簡單地使用args[]沒法很好的完成需求。通過網上的一番搜索,我找到Commons.cli庫能夠較好地處理命令行傳參,因而我打算藉助此次機會順便掌握如下更高級的命令行傳參。
首先從官網下載jar包,而後導入IDEA
java
由於我也是第一次接觸這個包,不太熟悉,這是一些參考連接:Java命令行參數解析、使用 Apache Commons CLI 開發命令行工具示例,這是官方文檔git
最簡單的使用須要如下類和方法
apache
大概框架寫出來是這樣api
public class MyCP { public static void main(String[] args) { // Create a Parser CommandLineParser parser = new DefaultParser(); Option optiontx=new Option("tx","txt2bin",true,"Convert .txt to .bin"); optiontx.setArgs(2);//設置「-tx」選項固定參數數量爲2 optiontx.setRequired(false);//「-tx」參數不是必選 Option optionxt=new Option("xt","bin2txt",true,"Convert .bin to .txt"); optionxt.setArgs(2); optionxt.setRequired(false); Options options = new Options(); options.addOption(optiontx); options.addOption(optionxt); File srcfile,dstfile; try{ // Parse the program arguments CommandLine commandLine = parser.parse(options, args); // Set the appropriate variables based on supplied options if(commandLine.hasOption("tx")) { } else if (commandLine.hasOption("xt")) { } else { } } catch (Exception e){ System.out.println(e.getMessage()); } } }
更多的操做能夠去看文檔app
要實現MyCP,具體的需求分析以下:框架
具體代碼參考碼雲連接,以上需求均已實現工具
此次Junit較爲複雜,由於測試的是main方法,因此在參考一些博客後使用這樣的框架學習
@Test public void testNoOpt() { String[] args1 = {"1.txt", "2.txt"}; String[] args2 = {"1.txt", "src"}; MyCP.main(args1); MyCP.main(args2); try{ assertTrue(); assertTrue(); }catch (Exception e){ System.out.println(e.getMessage()); fail(); } }
由由於測試時要測試複製出來的文件是否和源文件同樣,因此在開始測試前須要初始化出源文件,這裏使用@Before來進行預處理測試
@Before public void init(){ File file = new File("1.txt"); File numFile = new File("number.txt"); File binaryFile = new File("binary.bin"); try{ file.createNewFile(); numFile.createNewFile(); binaryFile.createNewFile(); FileOutputStream output = new FileOutputStream(file); output.write("MyCP works perfectly!!".getBytes()); output = new FileOutputStream(numFile); output.write("10 a 9".getBytes()); output = new FileOutputStream(binaryFile); output.write("1111 10 1001".getBytes()); }catch (Exception e){ System.out.println(e.getMessage()); } }
具體代碼見碼雲連接
因爲此次時間比較緊迫,在本次的Junit測試中沒有測試應該拋出的異常,可是我都經過直接運行的方式測試過了。此次Junit測試主要嘗試之前沒有試過的main方法測試和預處理。
最終測試結果以下
其實像這樣本身去學習新的東西,爲了實現本身設定的需求,一步一步精益求精,遇到問題馬上着手去解決,一邊作一邊學習,這種學習方法我比較習慣。多是由於還算感興趣的緣由,雖然已經很晚了,可是我仍是想把本身的程序寫完。其實如今我已經在思考爲了這麼一個小做業這麼麻煩是否是有點吃力不討好,可是無論怎麼說,我已經付出了努力,哪怕寫出來的東西幼稚讓人笑話,這大概就是我在有限時間有限精力下能發揮的極限了。 最近由於打ctf比賽,不少原本可能作的我的項目,能夠寫的博客都沒有寫。我深入感覺到本身能力的有限,一方面ctf一竅不通,另外一方面java趕不上來。不過我相信努力會有回報的,笨鳥先飛不是嗎?我也懇請老師能指出我代碼的不足或者走的方向有錯,畢竟提升效率、及時總結糾錯比蠻幹有效多了。