使用commons.cli實現MyCP

Commons.cli庫

考慮到此次的任務是實現本身的命令行命令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

要實現MyCP,具體的需求分析以下:框架

  • 沒有參數時實現複製文件
    • 源文件必須爲存在,目的文件能夠是目錄或文件
    • 目的文件爲路徑時,在目的路徑建立與源文件同名的文件;若目的路徑是源文件所在路徑,則退出程序並打印「filename is the same file with filename」(未徹底解決目的文件爲源文件的狀況,目前想到能夠嘗試文件鎖,可是尚未實施)
    • 目的文件爲文件名時,建立目的文件,內容爲源文件的複製
  • 參數爲「-tx」時,將源文件中的十進制數字複製到目的文件並轉爲二進制
  • 參數爲「-xt」時,將源文件中的二進制數字複製到目的文件並轉爲十進制

具體代碼參考碼雲連接,以上需求均已實現工具

測試代碼

此次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趕不上來。不過我相信努力會有回報的,笨鳥先飛不是嗎?我也懇請老師能指出我代碼的不足或者走的方向有錯,畢竟提升效率、及時總結糾錯比蠻幹有效多了。

相關文章
相關標籤/搜索