日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

《Jakarta commons cookbook》學(xué)習(xí)筆記

 燮羽 2010-11-25


關(guān)于Jakarta 摘抄維基百科: 
引用
Jakarta是Apache組織下的一套Java解決方案的開源軟件的名稱,它包括了很多子項(xiàng)目。Tomcat、Ant、Struts等等現(xiàn)在是Apache下的開源項(xiàng)目,也曾是Jakarta的關(guān)聯(lián)項(xiàng)目。 
Jakarta的名稱是想把與Jakarta關(guān)系非常深的爪哇島關(guān)聯(lián)起來。編程語言Java的命名源自這個島的名字(印尼語:Jawa、英語:Java),而城市雅加達(dá)(Jakarta)正是這個島上的第一大城市,也是印度尼西亞的首府。


Jakarta工具包可謂java開發(fā)中的必備神器, 熟悉里面各種工具類的用法, 可以讓我們少重復(fù)發(fā)明一些輪子.它里面的一些commons包也成了很多開源項(xiàng)目的必備依賴. 比如spring, hibernate之流. 

這本書講到了Jakarta中幾個比較重要的包的用法, 由于Jakarta中很多工具類的JavaDoc寫的非常棒, 因此, 里面大部分工具類我們通過閱讀其JavaDoc都應(yīng)用的得心應(yīng)手. 而這本書給我的最大體會, 就是發(fā)現(xiàn)了Jakarta中更多的寶貝, 而且熟悉了更多的用法. 缺點(diǎn)就是此書有點(diǎn)老了, 而Jakarta發(fā)展的太快, 書里面的很多內(nèi)容在實(shí)際的工具包中都對不上號了 

Commons Lang 
ToStringBuilder, HashCodeBuilder, EqualsBuilder, CompareToBuilder這些東西做過java的幾乎人人都知道了吧 
介紹幾個很少用的: 

ArrayUtils.toString() 
將數(shù)組用大括號括起來, 用逗號分隔輸出.如果碰到null元素, 將輸出unkown字符串. 如果是collection要輸出, 可以先toArray() 

ArrayUtils.contains() 
檢查數(shù)組中是否包含指定的元素, indexOf(), lastIndexOf()可以指定元素所在數(shù)組的下標(biāo) 

ArrayUtils.toMap() 
將一個二維數(shù)組轉(zhuǎn)換成一個map對象. 

FastDateFormat 
可以線程安全的實(shí)現(xiàn)對日期進(jìn)行格式化. 

DateUtils.round() 
可以將日期時(shí)間舍入到最近的日期, 比如DateUtils.round(new Date(), Calendar.Month);將對當(dāng)前日期中月后面的內(nèi)容舍棄.DateUtils.SEMI_MONTH, 將日期舍入到一個月的中間和開頭. 

DateUtils.truncate() 
則類似Math.floor()對指定域(如Calendar.MONTH)之后的內(nèi)容進(jìn)行截取處理. 

Validate 
用來對方法參數(shù)進(jìn)行驗(yàn)證, 當(dāng)遇到無效的參數(shù)時(shí), 將拋出IllegalArgumentException異常 

StopWatch 
用來度量某段代碼的執(zhí)行耗時(shí), 和現(xiàn)實(shí)中的秒表有一樣的功能, 你可以啟動, 停止, 展廳, 恢復(fù)計(jì)時(shí), 重置以及拆分它. 其中split()/unsplit()方法類似于秒表中的分圈計(jì)時(shí). 

文本處理 

StringUtils.abbreviate() 
用于將指定的字符串進(jìn)行縮減處理, 而且還可以從指定的位置開始縮減. 
比如StringUtils.abbreviate("this is a test", 10) 得到的是"this is..."字符串 

StringUtils.substringBetween() 
返回被兩個指定參數(shù)包圍起來的字符串內(nèi)容. 比如將<html>標(biāo)簽包圍的內(nèi)容返回, StringUtils.substringBetween(htmlString, "<html>", "</html>"); 

StirngUitls.strip() 
可以將字符串中首尾含有指定的內(nèi)容清除之 
比如
Java代碼 
  1. StirngUtils.strip("-------****------ABCDE!-------*******-----------""-*")  
得到的是"ABCDE!" 

StringUtils.chomp() 
取出字符串末尾的回車換行符, 當(dāng)然可以指定刪除最后的那個字符 

Java代碼 
  1. String stars = StringUtils.repeat("*"40);   
  2. String center = StringUtils.center("TEST"40"*");   
  3. String heading = StringUtils.join(new Object(){stars, center, stars}, "\n");   

得到如下字符串 
引用
***************************** 
************TEST************ 
*****************************


StringUtils.countMatches() 
返回一段文本在另一段字符串中出現(xiàn)的次數(shù). 

StringUtils.deference() 
輸出兩個字符串之間的差別, indexOfDeference()指出兩個字符串之間開始出現(xiàn)差別的位置, getLevenshteinDistance(), 指出從一個字符串轉(zhuǎn)換到另一個字符串需要執(zhí)行的插入, 刪除和替換的次數(shù). 

JavaBean 

PropertyUtils.getSimpleProperty() 
通過屬性名返回bean屬性值 

getNestedProperty() 
返回嵌套屬性值, 比如getNestedProperty(book, "name.firstName"); 

getIndexedProperty() 
從數(shù)組或List型Bean屬性中返回指定的下標(biāo)元素, 比如getIndexedProperty(book, "chapters[1]"); 

getMappedProperty() 
從指定map類型的bean屬性中返回值, 比如getMappedProperty(apartment, "rooms(dining)"); 

getProperty() 
可以返回任何屬性, 比如 getProperty(country, "regions[0].cities(richmond).population"); 

BeanComparator
 
用來根據(jù)bean屬性來排列和比較bean 
比如: 
Collections.sort(countryList, new BeanComparator("bean"))// 根據(jù)國家名稱對國家列表進(jìn)行排序 

PropertyUtils.describe() 
可創(chuàng)建一個包含bean實(shí)例中所有可讀屬性的map對象 

BeanMap 
可以將一個bean封裝成一個通過Map接口來對bean屬性進(jìn)行訪問. 

DynaBean 
用來在運(yùn)行時(shí)動態(tài)創(chuàng)建一個bean. 
Java代碼 
  1. DynaProperty[] props = new DynaProperty[] {   
  2. new DynaProperty("name", String.class),   
  3. };   
  4. BasicDynaClass clazz = new BasicDynaClass("book", BasicDynaClass.class, props);   
  5. DynaBean bean = clazz.newInstance();   
  6. bean.set("name""macro");   


BeanUtils 
以字符串的形式讀取和設(shè)置bean屬性. 

函數(shù)對象 
用來提供更高級的代碼重用性和更簡潔的設(shè)計(jì), 它用來將功能邏輯從面向特性數(shù)據(jù)結(jié)構(gòu)的算法中抽象并提取出來. 
我們最常用的就是Comparator和Iterator. 

ReverseComparator 
用來將Comparator的功能反轉(zhuǎn), 比如順序改成倒序 

ComparatorChain 
會把連接中的每一個Comparator進(jìn)行比較, 如果當(dāng)前Comparator返回值為0, 則調(diào)用下一個, 直到連接中沒有其他的Comparator. 

NullComparator 
對null元素進(jìn)行排序, 還可以控制null出現(xiàn)在排序的開始還是結(jié)尾, 一般NullComparator用來對其他的Comparator進(jìn)行裝飾. 

當(dāng)數(shù)組和Collection含有預(yù)定順序關(guān)系時(shí), 可使用FixedOrderComparator進(jìn)行排序, 這種順序關(guān)系包括一周里面星期幾的順序, 太陽系中行星的順序, 光譜中的顏色順序. 
Java代碼 
  1. String[] medalOrder = new String[] {"tin""bronze""siliver""gold"};   
  2. Comparator medalComparator = new FixedOrderComparator(medalOrder);   
  3. Comparator beanComparator = new BeanComparator("medal", medalComparator);   
  4. beanComparator.compare(medal1, medal2);   


Predicates 
使用Predicate用來評估某個判別式或者條件, Predicate是一種可判別其他對象并返回true或false的對象. 整個Commons Collection都用它來進(jìn)行篩選, 選擇以及驗(yàn)證工作.可以將其理解為對if條件的一種封裝, 該接口的唯一方法evaluate()返回true和false. 

UniquePredicate 
當(dāng)對象首次被evaluate時(shí)返回true, 該predicate內(nèi)部維護(hù)了一個evaluate對象的HashSet對象, 如果對象已經(jīng)存在其中, 將返回false. 用來從collection中不重復(fù)的獲取對象. 

Predicate可以用于任何場合, 比如驗(yàn)證用戶輸入, 篩選collection內(nèi)容或者用于替換負(fù)責(zé)的邏輯條件 

Transformer 
用來將一個對象為參數(shù), 返回一個經(jīng)過轉(zhuǎn)換處理后的新的對象 

ChainedTransformer 
用來將多個Transformer連接起來. 

SwitchTransformer 
實(shí)施一個依賴于某Predicate的Transformer. 他能對一個switch進(jìn)行建模, 并接受三個參數(shù), 一個Predicate數(shù)組, 一個Transformer數(shù)組, 一個默認(rèn)的Transformer.兩個數(shù)組是一一對應(yīng)的關(guān)系, 如果Predicate都不滿足則執(zhí)行默認(rèn)的Transformer. 

Closure 
用來將對某個對象的一段代碼進(jìn)行封裝. 比如對某件商品進(jìn)行打折處理, 可以將打折處理過程封裝成一個Closure. 

ChainedClosure 
用來將多個Closure進(jìn)行鏈接, 與Transformer不同在于, 每個Transformer處理完之后的結(jié)果傳給下一個Transformer, 而Closure鏈傳遞的是同一個對象. 好像轎車通過工廠的流水線一樣. 

IfClosure 
提供一個Predicate和兩個Closure, 如果Predicate判定為true, 執(zhí)行第一個Closure, 否則執(zhí)行第二個. 

WhileClosure 
用來模擬循環(huán)處理, 它需要傳遞一個Predicate和一個Closure, 如果條件為true, 那么不斷執(zhí)行Closure, 知道條件為false為止. 

ForClosure用來執(zhí)行指定次數(shù)的Closure. 

Collection 

LoopIterator 
用來重復(fù)的便利Collection, 該遍歷將永不停止, 因?yàn)槠銱asNext()返回值永遠(yuǎn)是true, 當(dāng)用while進(jìn)行遍歷的時(shí)候,不要忘記添加退出條件. 
對于需要不停的判斷一系列取值或者反復(fù)執(zhí)行一組命令時(shí), 使用LoopingIterator就非常合適. 同時(shí)它還實(shí)現(xiàn)了ResettableIterator接口, 在執(zhí)行的過程中, 通過執(zhí)行reset()方法可以跳回到Collection的起始位置. 
從只有三項(xiàng)的List中循環(huán)取出5項(xiàng) 
Java代碼 
  1. LoopingIterator itor = new LoopingIterator(list);   
  2. for(int i = 0; i < 5; i++) {   
  3. String element = (String)itor.next();   
  4. }   


ArrayListIterator 
用來遍歷ArrayList中指定的部分內(nèi)容.通過nextIndex()可以獲取某個元素的下標(biāo). 

FilterIterator 
包含了一個Predicate, 如果Predicate為true則該元素將包含在迭代器中. 從來達(dá)到遍歷某個Collection中合乎特定條件的元素, 或者刪除不符合條件的元素.它實(shí)際上對指定Iterator的一個裝飾而已. 

Collections.filter() 
方法用來將不符合條件的元素從Collection中移除, 因此具有破壞性.如果不想破壞原有的Collection, 可以使用CollectionUtils.select()和 

CollectionsUtils.selectRejected() 
創(chuàng)建一個含有所有符合或者不符合條件元素的新的Collection. 

UniqueFilterIterator 
可以在遍歷Collection時(shí)跳過重復(fù)元素. 

Bag 
容器用來對同一個對象存儲多次, 并跟蹤對象有多少份拷貝.比如某個Bag包含20份A對象的拷貝, 50份B對象的拷貝. Bag有兩種, 使用HashMap的HashBag, 具有更高的性能, 還有一種是TreeBag, 它需要維護(hù)對象元素加入的順序.將以加入的順序返回它們. 

Buffer 
分為兩種:UnboundedFifoBuffer 無大小限制, BoundFifoBuffer 有大小限制.該容器類似JDK中的Queue, queue中的offer和peek功能與add和remove方法具有相同的功能, 唯一的區(qū)別是想Queue中添加數(shù)據(jù)遇到問題時(shí)會拋異常. 
還有一種具有優(yōu)先級的Buffer:PriorityBuffer, 對象會根據(jù)Comparator生成的優(yōu)先級來決定是否被移除. 移除對象的邏輯類似于醫(yī)院的急診室工作流程.病情嚴(yán)重的病人將得到優(yōu)先治療的權(quán)利.這個與PriorityQueue. 
BlockingBuffer為阻塞式Buffer.如果系統(tǒng)需要在某段數(shù)據(jù)就緒時(shí)進(jìn)行處理的話, 就應(yīng)該使用這種Buffer. 或者系統(tǒng)中有多個進(jìn)行同時(shí)偵聽流水線主鍵緩沖區(qū)時(shí), 該數(shù)據(jù)結(jié)構(gòu)也很管用.JDK5中也有與之對應(yīng)的BlockingQueue. 

MultiMap 
用于給指定的鍵維護(hù)一組值. 當(dāng)需要一個對象關(guān)聯(lián)多個對象的時(shí)候, 使用MultiMap是個好主意. 

BidMap 
是這樣一種Map實(shí)現(xiàn):當(dāng)鍵值都唯一的時(shí)候, 可以根據(jù)值來查對應(yīng)的鍵 
DualHashBidMap 把鍵和值存在兩個HashMap中, 其中一個存key-value, 一個存value-key 

CaseInsensitiveMap 
key為大小寫不敏感String類型的map 

PredicateMap 
增加了驗(yàn)證功能的map, 在put一個entry的時(shí)候, 如果驗(yàn)證顯示為false的話, 將拋出IllegalArgumentException異常. 

CollectionUtils.transform() 
該方法接收兩個參數(shù), 用來通過Transformer, 將制定的Collection進(jìn)行轉(zhuǎn)換, 得到一個新的經(jīng)過轉(zhuǎn)換后的Collection 

LRUMap 
一種固定尺寸的Map, 當(dāng)達(dá)到最大容量時(shí)會借助最近最少使用算法社區(qū)相應(yīng)的項(xiàng). 

LazyMap 
當(dāng)根據(jù)某個鍵檢索某個值的時(shí)候, 將通過指定Transformer, 創(chuàng)建該值. 
Java代碼 
  1. Transformer t = new Transformer() {  
  2.   
  3.     public Object transform(Object arg0) {  
  4.         return StringUtils.reverse((String) arg0);  
  5.     }  
  6. };  
  7.   
  8. Map names = new HashMap();  
  9.   
  10. Map lazyMap = LazyMap.decorate(names, t);  
  11.   
  12. Object value = lazyMap.get("MacroChen");  
  13. System.out.println(value);  

LazyMap的另一個應(yīng)用場景是通過給定的值從數(shù)據(jù)庫中檢索相應(yīng)的記錄.用LazyMap將LRUMap進(jìn)行包裝是一個不錯的注意. 

CollectionUtils.countMatches(), cardinality() 
用來統(tǒng)計(jì)某個對象出現(xiàn)的次數(shù), countMatches()根據(jù)Predicate從指定的Collection中返回滿足條件的元素?cái)?shù)目. 而后者從collection中返回指定對象的數(shù)目. 

CollectionUtils.union(), intersection(), disjunction(), subtract() 
分別對兩個集合進(jìn)行并集, 交集, 聯(lián)集和差集. 

PropertiesConfiguration 
對Properties的適度增強(qiáng), 能直接將對應(yīng)的value轉(zhuǎn)換成相應(yīng)的類型, 比如以逗號分割的字符串轉(zhuǎn)換成List, 數(shù)字字面值轉(zhuǎn)換成數(shù)字值.而不是字符串. 

Commons Logging 
能在運(yùn)行時(shí), 通過檢測, 能調(diào)用相應(yīng)的日志框架. 比如jdk自帶的日志框架和Log4J等. 
比如默認(rèn)情況下, 下面的代碼: 
Java代碼 
  1. public class LoggingTest {  
  2.     static Log log = LogFactory.getLog("mylog.LogginTest");  
  3.     public static void main(String[] args) {  
  4.         log.info(log);  
  5.     }  
  6. }  

將返回 
引用
信息: org.apache.commons.logging.impl.Jdk14Logger@83cc67

當(dāng)LogFactory.getInstance()被調(diào)用的時(shí)候, CommonLogging將通過檢測一些系統(tǒng)屬性和類路徑中庫的情況來定位和管理合適的日志框架. 
所以如果將log4j加入到類路徑之后輸出將變成這樣: 
引用
log4j:WARN Please initialize the log4j system properly.

如果配置了log4j.properties, 那么輸出結(jié)果可能變成: 
引用
DEBUG (LoggingTest.java:14) org.apache.commons.logging.impl.Log4JLogger@758fc9


要顯示的將logging設(shè)置為使用log4j來做日志輸出, 可以通過下面的設(shè)置滿足要求 
Java代碼 
  1. System.setProperty("org.apache.commons.logging.Log""org.apache.commcons.logging.impl.Log4JLogger");  


Commons IO 

CopyUtils 
用來將某個InputStream, Reader, byte[]的內(nèi)容copy到OutputStream或者Writer. 

IOUtils.toString() 
用來將信息從Reader或者InputStream中copy到字符串中. 

IOUtils.closeQuietly() 
用來只有的關(guān)閉某個InputStream, OutputStream, Reader或Writer, 而不用擔(dān)心null或者IOException, 這個一般放在finally中執(zhí)行. 

FileUtils.byteCountToDisplaySize() 
以KB, MB, GB的形式顯示某個文件大小, 該工具類有三個靜態(tài)變量, ONE_KB, ONE_GB, ONE_MB, 不用大家應(yīng)該也知道了.另外他不會對文件大小進(jìn)行四舍五入操作, 比如一個2.9MB的文件, 得到是2MB, 也就是說余數(shù)被統(tǒng)統(tǒng)舍棄了. 

FileUtils.copyFile(), copyFileToDirectory(), writeStringToFile() 
分別是拷貝文件, 拷貝文件到指定的文件夾, 拷貝字符串內(nèi)容到文件. 

FileUtils.deleteDirectory(), cleanDirectory(), sizeOfDirectory() 
遞歸刪除目錄和清空目錄下的所有文件, 獲取指定目錄下所有內(nèi)容的總大小. 

FileUtils.touch() 
類似unix下的touch命令, 如果文件不存在將創(chuàng)建一個新的文件.如果文件存在, 則更新文件的時(shí)間戳為當(dāng)前時(shí)間. 

IOFileFilter 
關(guān)于文件的過濾, 包括FileFilter, FilenameFilter, PrefixFileFilter, SuffixFileFilter, DirectoryFileFilter, 以及AndFileFilter等邏輯過濾器. 

CountingInputStream和CountingOutputStream 
用來跟蹤進(jìn)入某個Stream的byte數(shù)量.它可以視為是各種Stream的一種裝飾器類 

TeeOutputStream 
用來將相同的數(shù)據(jù)發(fā)送到兩個OutputStream. 
 
1 樓 nisen 2009-12-08   引用
我是這本書的審校,commons還有更多的好玩的東東,而且現(xiàn)在不叫jakarta commons 了而是commons了,并且成了apache的頂層項(xiàng)目。

BeanUtils,Lang,Collections,logging 應(yīng)該是commons中最核心的組件。我這里有一個分類

Core:BeanUtils,Lang,Collections,logging
Db:DbUtils,DBCP,Pool
IO: IO,
XML vs Bean:betwixt,Digester,JXPath,Jelly
模版:EL, JEXL
通用:Codec,Id
Web:FileUpload,httpClient
文件系統(tǒng):VFS

其他的可以暫時(shí)不考慮,當(dāng)然有一些已經(jīng)過時(shí)的,比如Attributes,跟jdk1.5中的注解差不多,不在使用了,比如Lang中的枚舉

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多