關(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)起來(lái)。編程語(yǔ)言Java的命名源自這個(gè)島的名字(印尼語(yǔ):Jawa、英語(yǔ):Java),而城市雅加達(dá)(Jakarta)正是這個(gè)島上的第一大城市,也是印度尼西亞的首府。
Jakarta工具包可謂java開發(fā)中的必備神器, 熟悉里面各種工具類的用法, 可以讓我們少重復(fù)發(fā)明一些輪子.它里面的一些commons包也成了很多開源項(xiàng)目的必備依賴. 比如spring, hibernate之流.
這本書講到了Jakarta中幾個(gè)比較重要的包的用法, 由于Jakarta中很多工具類的JavaDoc寫的非常棒, 因此, 里面大部分工具類我們通過(guò)閱讀其JavaDoc都應(yīng)用的得心應(yīng)手. 而這本書給我的最大體會(huì), 就是發(fā)現(xiàn)了Jakarta中更多的寶貝, 而且熟悉了更多的用法. 缺點(diǎn)就是此書有點(diǎn)老了, 而Jakarta發(fā)展的太快, 書里面的很多內(nèi)容在實(shí)際的工具包中都對(duì)不上號(hào)了
Commons Lang
ToStringBuilder, HashCodeBuilder, EqualsBuilder, CompareToBuilder這些東西做過(guò)java的幾乎人人都知道了吧
介紹幾個(gè)很少用的:
ArrayUtils.toString()
將數(shù)組用大括號(hào)括起來(lái), 用逗號(hào)分隔輸出.如果碰到null元素, 將輸出unkown字符串. 如果是collection要輸出, 可以先toArray()
ArrayUtils.contains()
檢查數(shù)組中是否包含指定的元素, indexOf(), lastIndexOf()可以指定元素所在數(shù)組的下標(biāo)
ArrayUtils.toMap()
將一個(gè)二維數(shù)組轉(zhuǎn)換成一個(gè)map對(duì)象.
FastDateFormat
可以線程安全的實(shí)現(xiàn)對(duì)日期進(jìn)行格式化.
DateUtils.round()
可以將日期時(shí)間舍入到最近的日期, 比如DateUtils.round(new Date(), Calendar.Month);將對(duì)當(dāng)前日期中月后面的內(nèi)容舍棄.DateUtils.SEMI_MONTH, 將日期舍入到一個(gè)月的中間和開頭.
DateUtils.truncate()
則類似Math.floor()對(duì)指定域(如Calendar.MONTH)之后的內(nèi)容進(jìn)行截取處理.
Validate
用來(lái)對(duì)方法參數(shù)進(jìn)行驗(yàn)證, 當(dāng)遇到無(wú)效的參數(shù)時(shí), 將拋出IllegalArgumentException異常
StopWatch
用來(lái)度量某段代碼的執(zhí)行耗時(shí), 和現(xiàn)實(shí)中的秒表有一樣的功能, 你可以啟動(dòng), 停止, 展廳, 恢復(fù)計(jì)時(shí), 重置以及拆分它. 其中split()/unsplit()方法類似于秒表中的分圈計(jì)時(shí).
文本處理
StringUtils.abbreviate()
用于將指定的字符串進(jìn)行縮減處理, 而且還可以從指定的位置開始縮減.
比如StringUtils.abbreviate("this is a test", 10) 得到的是"this is..."字符串
StringUtils.substringBetween()
返回被兩個(gè)指定參數(shù)包圍起來(lái)的字符串內(nèi)容. 比如將<html>標(biāo)簽包圍的內(nèi)容返回, StringUtils.substringBetween(htmlString, "<html>", "</html>");
StirngUitls.strip()
可以將字符串中首尾含有指定的內(nèi)容清除之
比如Java代碼
StirngUtils.strip("-------****------ABCDE!-------*******-----------", "-*")
得到的是"ABCDE!"
StringUtils.chomp()
取出字符串末尾的回車換行符, 當(dāng)然可以指定刪除最后的那個(gè)字符
Java代碼
String stars = StringUtils.repeat("*", 40); String center = StringUtils.center("TEST", 40, "*"); String heading = StringUtils.join(new Object(){stars, center, stars}, "\n");
得到如下字符串
引用
*****************************
************TEST************
*****************************
StringUtils.countMatches()
返回一段文本在另一段字符串中出現(xiàn)的次數(shù).
StringUtils.deference()
輸出兩個(gè)字符串之間的差別, indexOfDeference()指出兩個(gè)字符串之間開始出現(xiàn)差別的位置, getLevenshteinDistance(), 指出從一個(gè)字符串轉(zhuǎn)換到另一個(gè)字符串需要執(zhí)行的插入, 刪除和替換的次數(shù).
JavaBean
PropertyUtils.getSimpleProperty()
通過(guò)屬性名返回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
用來(lái)根據(jù)bean屬性來(lái)排列和比較bean
比如:
Collections.sort(countryList, new BeanComparator("bean"))// 根據(jù)國(guó)家名稱對(duì)國(guó)家列表進(jìn)行排序
PropertyUtils.describe()
可創(chuàng)建一個(gè)包含bean實(shí)例中所有可讀屬性的map對(duì)象
BeanMap
可以將一個(gè)bean封裝成一個(gè)通過(guò)Map接口來(lái)對(duì)bean屬性進(jìn)行訪問(wèn).
DynaBean
用來(lái)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建一個(gè)bean.
Java代碼
DynaProperty[] props = new DynaProperty[] { new DynaProperty("name", String.class), }; BasicDynaClass clazz = new BasicDynaClass("book", BasicDynaClass.class, props); DynaBean bean = clazz.newInstance(); bean.set("name", "macro");
BeanUtils
以字符串的形式讀取和設(shè)置bean屬性.
函數(shù)對(duì)象
用來(lái)提供更高級(jí)的代碼重用性和更簡(jiǎn)潔的設(shè)計(jì), 它用來(lái)將功能邏輯從面向特性數(shù)據(jù)結(jié)構(gòu)的算法中抽象并提取出來(lái).
我們最常用的就是Comparator和Iterator.
ReverseComparator
用來(lái)將Comparator的功能反轉(zhuǎn), 比如順序改成倒序
ComparatorChain
會(huì)把連接中的每一個(gè)Comparator進(jìn)行比較, 如果當(dāng)前Comparator返回值為0, 則調(diào)用下一個(gè), 直到連接中沒(méi)有其他的Comparator.
NullComparator
對(duì)null元素進(jìn)行排序, 還可以控制null出現(xiàn)在排序的開始還是結(jié)尾, 一般NullComparator用來(lái)對(duì)其他的Comparator進(jìn)行裝飾.
當(dāng)數(shù)組和Collection含有預(yù)定順序關(guān)系時(shí), 可使用FixedOrderComparator進(jìn)行排序, 這種順序關(guān)系包括一周里面星期幾的順序, 太陽(yáng)系中行星的順序, 光譜中的顏色順序.
Java代碼
String[] medalOrder = new String[] {"tin", "bronze", "siliver", "gold"}; Comparator medalComparator = new FixedOrderComparator(medalOrder); Comparator beanComparator = new BeanComparator("medal", medalComparator); beanComparator.compare(medal1, medal2);
Predicates
使用Predicate用來(lái)評(píng)估某個(gè)判別式或者條件, Predicate是一種可判別其他對(duì)象并返回true或false的對(duì)象. 整個(gè)Commons Collection都用它來(lái)進(jìn)行篩選, 選擇以及驗(yàn)證工作.可以將其理解為對(duì)if條件的一種封裝, 該接口的唯一方法evaluate()返回true和false.
UniquePredicate
當(dāng)對(duì)象首次被evaluate時(shí)返回true, 該predicate內(nèi)部維護(hù)了一個(gè)evaluate對(duì)象的HashSet對(duì)象, 如果對(duì)象已經(jīng)存在其中, 將返回false. 用來(lái)從collection中不重復(fù)的獲取對(duì)象.
Predicate可以用于任何場(chǎng)合, 比如驗(yàn)證用戶輸入, 篩選collection內(nèi)容或者用于替換負(fù)責(zé)的邏輯條件
Transformer
用來(lái)將一個(gè)對(duì)象為參數(shù), 返回一個(gè)經(jīng)過(guò)轉(zhuǎn)換處理后的新的對(duì)象
ChainedTransformer
用來(lái)將多個(gè)Transformer連接起來(lái).
SwitchTransformer
實(shí)施一個(gè)依賴于某Predicate的Transformer. 他能對(duì)一個(gè)switch進(jìn)行建模, 并接受三個(gè)參數(shù), 一個(gè)Predicate數(shù)組, 一個(gè)Transformer數(shù)組, 一個(gè)默認(rèn)的Transformer.兩個(gè)數(shù)組是一一對(duì)應(yīng)的關(guān)系, 如果Predicate都不滿足則執(zhí)行默認(rèn)的Transformer.
Closure
用來(lái)將對(duì)某個(gè)對(duì)象的一段代碼進(jìn)行封裝. 比如對(duì)某件商品進(jìn)行打折處理, 可以將打折處理過(guò)程封裝成一個(gè)Closure.
ChainedClosure
用來(lái)將多個(gè)Closure進(jìn)行鏈接, 與Transformer不同在于, 每個(gè)Transformer處理完之后的結(jié)果傳給下一個(gè)Transformer, 而Closure鏈傳遞的是同一個(gè)對(duì)象. 好像轎車通過(guò)工廠的流水線一樣.
IfClosure
提供一個(gè)Predicate和兩個(gè)Closure, 如果Predicate判定為true, 執(zhí)行第一個(gè)Closure, 否則執(zhí)行第二個(gè).
WhileClosure
用來(lái)模擬循環(huán)處理, 它需要傳遞一個(gè)Predicate和一個(gè)Closure, 如果條件為true, 那么不斷執(zhí)行Closure, 知道條件為false為止.
ForClosure用來(lái)執(zhí)行指定次數(shù)的Closure.
Collection
LoopIterator
用來(lái)重復(fù)的便利Collection, 該遍歷將永不停止, 因?yàn)槠銱asNext()返回值永遠(yuǎn)是true, 當(dāng)用while進(jìn)行遍歷的時(shí)候,不要忘記添加退出條件.
對(duì)于需要不停的判斷一系列取值或者反復(fù)執(zhí)行一組命令時(shí), 使用LoopingIterator就非常合適. 同時(shí)它還實(shí)現(xiàn)了ResettableIterator接口, 在執(zhí)行的過(guò)程中, 通過(guò)執(zhí)行reset()方法可以跳回到Collection的起始位置.
從只有三項(xiàng)的List中循環(huán)取出5項(xiàng)
Java代碼
LoopingIterator itor = new LoopingIterator(list); for(int i = 0; i < 5; i++) { String element = (String)itor.next(); }
ArrayListIterator
用來(lái)遍歷ArrayList中指定的部分內(nèi)容.通過(guò)nextIndex()可以獲取某個(gè)元素的下標(biāo).
FilterIterator
包含了一個(gè)Predicate, 如果Predicate為true則該元素將包含在迭代器中. 從來(lái)達(dá)到遍歷某個(gè)Collection中合乎特定條件的元素, 或者刪除不符合條件的元素.它實(shí)際上對(duì)指定Iterator的一個(gè)裝飾而已.
Collections.filter()
方法用來(lái)將不符合條件的元素從Collection中移除, 因此具有破壞性.如果不想破壞原有的Collection, 可以使用CollectionUtils.select()和
CollectionsUtils.selectRejected()
創(chuàng)建一個(gè)含有所有符合或者不符合條件元素的新的Collection.
UniqueFilterIterator
可以在遍歷Collection時(shí)跳過(guò)重復(fù)元素.
Bag
容器用來(lái)對(duì)同一個(gè)對(duì)象存儲(chǔ)多次, 并跟蹤對(duì)象有多少份拷貝.比如某個(gè)Bag包含20份A對(duì)象的拷貝, 50份B對(duì)象的拷貝. Bag有兩種, 使用HashMap的HashBag, 具有更高的性能, 還有一種是TreeBag, 它需要維護(hù)對(duì)象元素加入的順序.將以加入的順序返回它們.
Buffer
分為兩種:UnboundedFifoBuffer 無(wú)大小限制, BoundFifoBuffer 有大小限制.該容器類似JDK中的Queue, queue中的offer和peek功能與add和remove方法具有相同的功能, 唯一的區(qū)別是想Queue中添加數(shù)據(jù)遇到問(wèn)題時(shí)會(huì)拋異常.
還有一種具有優(yōu)先級(jí)的Buffer:PriorityBuffer, 對(duì)象會(huì)根據(jù)Comparator生成的優(yōu)先級(jí)來(lái)決定是否被移除. 移除對(duì)象的邏輯類似于醫(yī)院的急診室工作流程.病情嚴(yán)重的病人將得到優(yōu)先治療的權(quán)利.這個(gè)與PriorityQueue.
BlockingBuffer為阻塞式Buffer.如果系統(tǒng)需要在某段數(shù)據(jù)就緒時(shí)進(jìn)行處理的話, 就應(yīng)該使用這種Buffer. 或者系統(tǒng)中有多個(gè)進(jìn)行同時(shí)偵聽流水線主鍵緩沖區(qū)時(shí), 該數(shù)據(jù)結(jié)構(gòu)也很管用.JDK5中也有與之對(duì)應(yīng)的BlockingQueue.
MultiMap
用于給指定的鍵維護(hù)一組值. 當(dāng)需要一個(gè)對(duì)象關(guān)聯(lián)多個(gè)對(duì)象的時(shí)候, 使用MultiMap是個(gè)好主意.
BidMap
是這樣一種Map實(shí)現(xiàn):當(dāng)鍵值都唯一的時(shí)候, 可以根據(jù)值來(lái)查對(duì)應(yīng)的鍵
DualHashBidMap 把鍵和值存在兩個(gè)HashMap中, 其中一個(gè)存key-value, 一個(gè)存value-key
CaseInsensitiveMap
key為大小寫不敏感String類型的map
PredicateMap
增加了驗(yàn)證功能的map, 在put一個(gè)entry的時(shí)候, 如果驗(yàn)證顯示為false的話, 將拋出IllegalArgumentException異常.
CollectionUtils.transform()
該方法接收兩個(gè)參數(shù), 用來(lái)通過(guò)Transformer, 將制定的Collection進(jìn)行轉(zhuǎn)換, 得到一個(gè)新的經(jīng)過(guò)轉(zhuǎn)換后的Collection
LRUMap
一種固定尺寸的Map, 當(dāng)達(dá)到最大容量時(shí)會(huì)借助最近最少使用算法社區(qū)相應(yīng)的項(xiàng).
LazyMap
當(dāng)根據(jù)某個(gè)鍵檢索某個(gè)值的時(shí)候, 將通過(guò)指定Transformer, 創(chuàng)建該值.
Java代碼
Transformer t = new Transformer() { public Object transform(Object arg0) { return StringUtils.reverse((String) arg0); } }; Map names = new HashMap(); Map lazyMap = LazyMap.decorate(names, t); Object value = lazyMap.get("MacroChen"); System.out.println(value);
LazyMap的另一個(gè)應(yīng)用場(chǎng)景是通過(guò)給定的值從數(shù)據(jù)庫(kù)中檢索相應(yīng)的記錄.用LazyMap將LRUMap進(jìn)行包裝是一個(gè)不錯(cuò)的注意.
CollectionUtils.countMatches(), cardinality()
用來(lái)統(tǒng)計(jì)某個(gè)對(duì)象出現(xiàn)的次數(shù), countMatches()根據(jù)Predicate從指定的Collection中返回滿足條件的元素?cái)?shù)目. 而后者從collection中返回指定對(duì)象的數(shù)目.
CollectionUtils.union(), intersection(), disjunction(), subtract()
分別對(duì)兩個(gè)集合進(jìn)行并集, 交集, 聯(lián)集和差集.
PropertiesConfiguration
對(duì)Properties的適度增強(qiáng), 能直接將對(duì)應(yīng)的value轉(zhuǎn)換成相應(yīng)的類型, 比如以逗號(hào)分割的字符串轉(zhuǎn)換成List, 數(shù)字字面值轉(zhuǎn)換成數(shù)字值.而不是字符串.
Commons Logging
能在運(yùn)行時(shí), 通過(guò)檢測(cè), 能調(diào)用相應(yīng)的日志框架. 比如jdk自帶的日志框架和Log4J等.
比如默認(rèn)情況下, 下面的代碼:
Java代碼
public class LoggingTest { static Log log = LogFactory.getLog("mylog.LogginTest"); public static void main(String[] args) { log.info(log); } }
將返回
引用
信息: org.apache.commons.logging.impl.Jdk14Logger@83cc67
當(dāng)LogFactory.getInstance()被調(diào)用的時(shí)候, CommonLogging將通過(guò)檢測(cè)一些系統(tǒng)屬性和類路徑中庫(kù)的情況來(lái)定位和管理合適的日志框架.
所以如果將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來(lái)做日志輸出, 可以通過(guò)下面的設(shè)置滿足要求
Java代碼
System.setProperty("org.apache.commons.logging.Log", "org.apache.commcons.logging.impl.Log4JLogger");
Commons IO
CopyUtils
用來(lái)將某個(gè)InputStream, Reader, byte[]的內(nèi)容copy到OutputStream或者Writer.
IOUtils.toString()
用來(lái)將信息從Reader或者InputStream中copy到字符串中.
IOUtils.closeQuietly()
用來(lái)只有的關(guān)閉某個(gè)InputStream, OutputStream, Reader或Writer, 而不用擔(dān)心null或者IOException, 這個(gè)一般放在finally中執(zhí)行.
FileUtils.byteCountToDisplaySize()
以KB, MB, GB的形式顯示某個(gè)文件大小, 該工具類有三個(gè)靜態(tài)變量, ONE_KB, ONE_GB, ONE_MB, 不用大家應(yīng)該也知道了.另外他不會(huì)對(duì)文件大小進(jìn)行四舍五入操作, 比如一個(gè)2.9MB的文件, 得到是2MB, 也就是說(shuō)余數(shù)被統(tǒng)統(tǒng)舍棄了.
FileUtils.copyFile(), copyFileToDirectory(), writeStringToFile()
分別是拷貝文件, 拷貝文件到指定的文件夾, 拷貝字符串內(nèi)容到文件.
FileUtils.deleteDirectory(), cleanDirectory(), sizeOfDirectory()
遞歸刪除目錄和清空目錄下的所有文件, 獲取指定目錄下所有內(nèi)容的總大小.
FileUtils.touch()
類似unix下的touch命令, 如果文件不存在將創(chuàng)建一個(gè)新的文件.如果文件存在, 則更新文件的時(shí)間戳為當(dāng)前時(shí)間.
IOFileFilter
關(guān)于文件的過(guò)濾, 包括FileFilter, FilenameFilter, PrefixFileFilter, SuffixFileFilter, DirectoryFileFilter, 以及AndFileFilter等邏輯過(guò)濾器.
CountingInputStream和CountingOutputStream
用來(lái)跟蹤進(jìn)入某個(gè)Stream的byte數(shù)量.它可以視為是各種Stream的一種裝飾器類
TeeOutputStream
用來(lái)將相同的數(shù)據(jù)發(fā)送到兩個(gè)OutputStream.
1 樓
nisen 2009-12-08
引用我是這本書的審校,commons還有更多的好玩的東東,而且現(xiàn)在不叫jakarta commons 了而是commons了,并且成了apache的頂層項(xiàng)目。
BeanUtils,Lang,Collections,logging 應(yīng)該是commons中最核心的組件。我這里有一個(gè)分類
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)過(guò)時(shí)的,比如Attributes,跟jdk1.5中的注解差不多,不在使用了,比如Lang中的枚舉