qfile - 一個封裝了對.txt,.csv,.html,.json格式文件進行簡單二次操作的方法的包

qfile簡介

qfile是專為懶人和新手而設的java程序包,它封裝一些對不同格式文件進行二次處理的一些方法。

為懶人而設

qfile封裝的方法是比較常用的,對文件進行二次處理的方法。

要知道在java中調用文件IO有關的類已經足夠繁瑣,獲得文件內容后再進行二次處理豈不是更煩?

例如我需要批量代替掉一個文本中的某些字符串,

  • 首先,我們要實例化一個FileReader,必要時要使用BufferedReader
  • 讀取字符串
  • 關閉之前創建的對象
  • 替代
  • 實例化FileWriter,必要時使用BufferedWriter
  • 寫入
  • flush
  • 關閉

是不是想想就很不爽?

然而現在,你只需要動動手指,調用一個api就可以搞掂啦。qflie讓你對文件的操作更輕松, 把剩下來的時間去和妹子玩耍

為新手而設

  • qfile的本質上并沒有什么黑科技,只是集中封裝了一些對文件二次操作的一些方法, 所以源碼簡單,對于有牢固java基礎想改進qfile的源碼的新手來說是友好的

  • api設計經過多次本人與朋友的多番討論,應該不會反人類,同時使用只需import語句而不需要配置一大堆, 這對想使用qfile的新手來說也是友好的。

  • 目前qfile能夠對txt,json,csv, html文件進行簡單處理(我知道json不是文件格式,這個設計是有原因的,下文再說), 知識面跨度比較廣,這對有一定基礎,想要更進一步學習其他知識的新人也是友好的

qfile的由來

java雖然有很多優點,但其語法臃腫繁瑣一直被人吐槽,作為用慣了python的我來說, 更是不可忍。

于是便打算嘗試封裝一下一些平常寫起來繁瑣但又不可避免的代碼, 再加上我正有嘗試自己寫一個庫的意向,方便自己,也方便別人,然后qfile便應運而生。

qfile的設計風格

可以由名字看出qfile是由q和file組成。

  • file主要指的這是針對文件相關的操作,
  • q則主要指輕便的,簡單的。

輕便在于它不依賴與第三方庫,例如在html的解析,和json的解析上java其實有豐富成熟的第三方庫, 但為了使其輕便,我在參考了第三方包功能的實現的同時,自己做了一些改動,保持了輕便性。

簡單在于我在保持輕便的時候,自然免不得要對其功能進行取舍,保留最基本最常用的操作, 例如在關于html和json的處理上,我的實現方式與其他的第三方庫的實現不同,qfile只保留了簡單常用的操作, 如果你需要更高的要求,請使用其他第三方的庫。

關于json處理的問題

我知道json不屬于文件格式,屬于一種約定成俗的數據格式,而鑒于sublime-text用了json來寫配置文件, 而我自己也認為用json寫配置文件有一定方便的地方,所以便把json也當成了一個文件類型來處理。 而同時我也留有api可以用作字符串解析成json對象,請參考文檔或下文的示例。

qfile的項目結構

  • qfile
    • QTxt 用于處理txt格式文件的類,提供對txt文件進行重寫,批量替代,批量統計,加密,解密等api
    • QCSV 用于處理csv格式文件的類,提供獲取數據矩陣,重寫該文件等api,
      • Matrix 內部類,用于數據的矩陣運算
    • QHtml 用于處理html格式文件的類,提供統計字符,統計html標簽,重寫文件,根據名稱,屬性獲取節點等api
      • NodeArray 內部類, 用于裝載節點,提供獲取數組長度,元素等api
    • Node 內部類,一個反映節點的類,提供獲取節點名稱,節點屬性,屬性值等api
    • QJson 用于處理json文件的類,提供重寫,獲取JSONObject,根據字符串構建JSONObject等api
      • JSONObject 用于處理json格式中{}所包括的數據的內部類,提供根據鍵值獲取數據的api
    • JSONArray 用于處理json格式中[]所包括的數據的內部類,提供根據鍵值獲取數據的api
    • QException 使用過程中可能會觸發的異常
    • Encryption 加密類,提供讓字符串加密的靜態方法,QTxt的加密正是它完成

qfile的代碼示例

使用qfile時,需要在IDE中把qfile.jar導入工程中,若是用編輯器編寫, 則需要在編譯的時候用-cp參數指定路徑。

  • 使用QTxt讀取text.txt的內容,并進行其他操作

    import java.utl.*;
    import qfile.*;
    public class Test {
    
        //123.txt的內容
        //I am happy
        //I am happy
        //I am happy
    
        public static void main(String[] args) throws Exception{
            String path = "123.txt";
          qfile.QTxt qt = new qfile.QTxt(path);
    
            System.out.println(文章內容:);
          System.out.println(qt.getContent()); 
            //獲取文章內容 
    
            System.out.println("happy出現的次數:"+qt.countWord("happy"));
            //單個統計字符串出現次數
    
            Map<String,String> m = new HashMap<String,String>();
          m.put("I", "you");m.put("am", "are");m.put("happy", "sad");
            System.out.println(替換后的字符串:)
          System.out.println(qt.replaceContent(m));
            //批量替換,但只是返回被替換后的字符串,并不會修改替換的內容
    
          qt.writeByReplacedContent(m);
            //批量替換后,會更改對象屬性并修改文件內容
            System.out.println("替換后文件的內容:")
          System.out.println(qt.getContent());
        }
    }
    /*************Out Put*****************************
    文章內容:
        I am happy
        I am happy
        I am happy 
        happy出現的次數:3
    替換后的字符串:
       you are sad
       you are sad
       you are sad
    替換后文件的內容:
       you are sad
       you are sad
       you are sad
    **************************************************/


  • 使用QJson解析json

    import qfile.*;
    
    public class Test{
       //123.json的內容
       //   {
       //        "long":123,
       //        "double":456.4,
       //        "String":"this is str",
       //        "boolean":true,
       //        "array":[1,2,3],
       //    "obj":{"str":"this is str in obj"},
       //   }
        public static void main(String[] avgs){
    
             QJson qj = new QJson(path);
           System.out.println("內容:");
         System.out.println(qj.getJsonStr());
    
         QJson.JSONObject jo = qj.getJsonObj();
         System.out.println("直接輸出該對象信息:" + jo);
    
         Set<String> s = jo.getKeys();
         Iterator<String> iter = s.iterator(); 
         System.out.println("該對象有如下鍵值:");
         while(iter.hasNext()){
             String key = iter.next();
           System.out.println(key);
         }
    
         System.out.println("根據鍵值獲取數據");
         System.out.println("boolean類型 --" + jo.getBoolean("boolean"));
         System.out.println("String類型 --" + jo.getString("String"));
         System.out.println("long類型 --" + jo.getLong("long"));
         System.out.println("double類型 --" + jo.getDouble("double"));
         System.out.println("array類型 --" + jo.getJSONArray("array"));
         System.out.println("obj類型 --" + jo.getJSONObject("obj")); 
    
            String str="{\"abc\":123}";
             QJson.JSONObject jo2 = QJson.buildJSONObject(str);
             System.out.println(jo2);
             //允許以字符串形式的方式獲取一個內部類的實例
        }
    }
    
       /*****************Out Put********************
       內容:
       {"long":123,"double":456.4,"String":"this is str","boolean":true,"array":[1,2,3],"obj":{"str":"this is str in obj"},}
       直接輸出該對象信息:
       QJson.JSONObject{"boolean":true,"array":QJson.JSONArray[1,2,3],"double":456.4,"obj":QJson.JSONObject{"str":"this is str in obj"},"String":"this is str","long":123}
       該對象有如下鍵值:
       boolean
       array
       double
       obj
       String
       long
       根據鍵值獲取數據
       boolean類型 --true
       String類型 --this is str
       long類型或int類型 --123
       double類型或float類型  --456.4
       array類型 --QJson.JSONArray[1,2,3]
       obj類型 --QJson.JSONObject{"str":"this is str in obj"}
       QJson.JSONObject{"abc":123}
       *****************************************************/


  • 使用QHtml解析html

    import qfile.*
    public class Test{
        /**123.html的內容
        <html>
        <body>
        <title>測試</title>
        <div class="></div>
        <div class="123" style="background">123</div>
        <div class="123">123</div>
        <div class="123">123</div>
        <a href="123.html">123.html</a>
        <a href="123.html">123.html</a>
        <a href="123.html">123.html</a>
        <a href="123.html">123.html</a>
        </body>
        </html>
        **/
        public static void main(String[] avgs){
            QHtml qh = new QHtml(path);
          System.out.println("html的題目:"+qh.getTitle());
    
        System.out.println("html內容:"+qh.getContent());
    
        System.out.println("div標簽出現的數目:"+qh.countTag("div"));
        QHtml.NodeArray na = qh.getTag("div");
            System.out.println("它們分別是");
        for(int i = 0;i<na.size();i++){
          QHtml.Node n = na.get(i);
          System.out.println(n);
          System.out.println("class屬性的值為:" + n.getValue("class"));
        }
    
        System.out.println("a標簽出現的數目:"+qh.countTag("a"));
        QHtml.NodeArray na1 = qh.getTag("a");
            System.out.println("它們分別是");
        for(int i = 0;i<na.size();i++){
          QHtml.Node n = na1.get(i);
          System.out.println(n);
          System.out.println("href屬性的值為:" +(n.getValue("href"));
        }
    
            String str = qh.getContent();
            QHtml.Html h = QHtml.buildHtml(str);
            System.out.println("字符串構建后");
            System.out.println(h);
            //支持字符串構建
        }
    }
    /***********************OutPut
    html的題目:測試
    html內容:<html>
    <body>
    <title>測試</title>
    <div></div>
    <div class="123" style="background-color:red">123</div>
    <div class="123">123</div>
    <div class="123">123</div>
    <a href="123.html">123.html</a>
    <a href="123.html">123.html</a>
    <a href="123.html">123.html</a>
    <a href="123.html">123.html</a>
    </body>
    </html>
    
    div標簽出現的數目:4
    它們分別是
    <div style="background-color:red" class="123">
    class屬性的值為:123
    <div class="123">
    class屬性的值為:123
    <div class="123">
    class屬性的值為:123
    <div>
    class屬性的值為:null
    a標簽出現的數目:4
    它們分別是
    <a href="123.html">
    href屬性的值為:123.html
    <a href="123.html">
    href屬性的值為:123.html
    <a href="123.html">
    href屬性的值為:123.html
    <a href="123.html">
    href屬性的值為:123.html
    System.out.println("字符串構建后");
    <html>
    <body>
    <title>測試</title>
    <div></div>
    <div class="123" style="background-color:red">123</div>
    <div class="123">123</div>
    <div class="123">123</div>
    <a href="123.html">123.html</a>
    <a href="123.html">123.html</a>
    <a href="123.html">123.html</a>
    <a href="123.html">123.html</a>
    </body>
    </html>
    *************************************/


  • 利用QCSV處理csv文檔

    impot qfile.*;
    public class Test{
    /**123.csv內容
    姓名,班級,分數
    小明,一班,75
    小紅,二班,45
    小黃,三班,69
    小李,一班,80
    ***************/
        public static void main(String[] avgs){
        String path = "123.csv";
            QCSV qc = new QCSV(path);
          System.out.println("內容:");
          System.out.println(qc.getContent());
    
        System.out.println("數據行數: "+ qc.getLine());
    
            System.out.println("矩陣形式:");
            QCSV.Matrix  qm = qc.getMat();
        System.out.println(qm);
    
        System.out.println("只提取數字部分的子矩陣");
        QCSV.Matrix qm2 = qm.getDataToMatrix(1, 2, qc.getLine()-1, 2);
        System.out.println(qm2);
    
            System.out.println("豎軸求和是:" + qm2.sumYToInt(0));
    
            System.out.println("豎軸求平均是:" + qm2.averYToDouble(0));
    
            System.out.println("按\"一班\"分類的子矩陣:");
        System.out.println(qm.classfiy(1,"一班" ));
    
        }
    }
    /*************************Out Put
    內容:
    姓名,班級,分數,
    小明,一班,75,
    小紅,二班,45,
    小黃,三班,69,
    小李,一班,80,
    數據行數: 5
    矩陣形式:
    [[姓名,班級,分數],
    [小明,一班,75],
    [小紅,二班,45],
    [小黃,三班,69],
    [小李,一班,80],]
    只提取數字部分的子矩陣
    [[75],
    [45],
    [69],
    [80],]
    豎軸求和是:269
    豎軸求平均是:67.25
    按"一班"分類的子矩陣:
    [[小明,一班,75],
    [小李,一班,80],]
    *********************************/

以上是qfile使用的一部分例子,更多的api信息請查看幫助文檔

qfile遵循協議

Apache Licence

由于個人實力原因,qfile還有很多不足的地方,希望各位指點。

項目地址: https://github.com/MashiMaroLjc/qfile

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!