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還有很多不足的地方,希望各位指點。