J2SE
【Java基礎專題】IO與文件讀寫---優(yōu)化搜索程序(01)
摘要: Apache commons CLI是一個開源的,用于處理命令行的工具包。這個包目前的穩(wěn)定版本是1.2,他非常簡單只有20個左右的class,但提供了幾乎所以可以用到的命令行功能。它的主頁在這里:Apache commons CLI
根據(jù)CLI的邏輯,每一個命令行的處理都可以分為3個步驟:定義、解析、交互
①定義:定義命令行的各種選項屬性(包括縮寫、全寫、是否必須、是否帶參數(shù)、參數(shù)個數(shù)限制)
②解析:使用解析器對命令行選項列表進行解析
③交互:從解析好的命令行查詢用戶輸入的參數(shù)值并進行處理
閱讀全文
posted @
2010-04-02 14:20 Paul Lin 閱讀(1073) |
評論 (0) 編輯
【Java基礎專題】IO與文件讀寫---DirectoryWalker和FileFilter的復雜條件使用
摘要: 1.基本功能過濾器
=============================================
①類型:DirectoryFileFilter、FileFileFilter
②大小:EmptyFileFilter、SizeFileFilter
③時間:AgeFileFilter
④名稱:NameFileFilter、PrefixFileFilter、SuffixFileFilter、RegexFileFilter、WildcardFileFilter
⑤讀寫屬性:CanReadFileFilter、CanWriteFileFilter
⑥隱藏屬性:HiddenFileFilter
2.邏輯關系過濾器
=============================================
①邏輯與:AndFileFilter
②邏輯或:OrFileFilter
③邏輯非:NotFileFilter
④永真/假:TrueFileFilter、FalseFil
閱讀全文
posted @
2010-04-01 17:52 Paul Lin 閱讀(3169) |
評論 (1) 編輯
【Java基礎專題】IO與文件讀寫---使用DirectoryWalker和FileFilterUtils進行搜索
摘要: Apache commons IO包中提供了一個可以遍歷目錄下資源的DirectoryWalker,還有很多的IOFileFilter用于過濾文件目錄。下面的例子分別演示了這個功能。
這兩個搜索類都是以內(nèi)部類的方式嵌入客戶端的,客戶端接收客戶的參數(shù),然后通過一個后臺線程來進行搜索,等待子線程完成搜索后(join方法),再打印搜索結(jié)果。
注意這個過程是可以被cancel的。cancel主要有2種情況。外部cancel:外部線程通過調(diào)用內(nèi)部類的cancel()方法。內(nèi)部cancel:在handleDirectory、handleFile中主動拋出CancelException。
walk方法在每次執(zhí)行前、后都會檢查當前是否有cancel指令發(fā)出(checkIfCancelled ---> handleIsCancelled),如果有那么默認立刻拋出CancelException,然后調(diào)用handleCancelled方法。
閱讀全文
posted @
2010-03-31 23:45 Paul Lin 閱讀(2572) |
評論 (1) 編輯
【Java基礎專題】IO與文件讀寫---對同步/異步和阻塞/非阻塞的理解
摘要: ①同步的操作,如果在等待的過程不能做別的事情,它是同步+阻塞的。這個也是最常見的
②同步的操作,如果在等待的過程可以做別的事情,它是同步+非阻塞的。
③異步的操作,如果在等待的過程不能做別的事情,它是異步+阻塞的。
④異步的操作,如果在等待的過程可以做別的事情,它是異步+非阻塞的。這個也是最常見的
閱讀全文
posted @
2010-03-10 15:36 Paul Lin 閱讀(2792) |
評論 (2) 編輯
【Java基礎專題】IO與文件讀寫---同步/異步與阻塞/非阻塞的區(qū)別(轉(zhuǎn))
摘要: 同步/異步:消息通知機制。是自己主動關注消息還是靠別人通知
阻塞/非阻塞:消息處理機制。等待消息處理完成的過程能否做別的事情
閱讀全文
posted @
2010-03-10 14:54 Paul Lin 閱讀(2638) |
評論 (0) 編輯
【Java基礎專題】IO與文件讀寫---使用Apache commons IO包進行資源遍歷
摘要: 要使用DirectoryWalker來遍歷一個目錄并進行相應的操作,步驟如下:
①創(chuàng)建一個繼續(xù)于DirectoryWalker的類,并在構(gòu)造方法中調(diào)用super();
②定義一個業(yè)務入口方法,例如clean。在這個方法中調(diào)用walk方法
③覆蓋DirectoryWalker類的handleDirectory方法,提供相應的處理邏輯
④覆蓋DirectoryWalker類的handleFile方法,提供相應的處理邏輯
閱讀全文
posted @
2010-03-09 00:26 Paul Lin 閱讀(3531) |
評論 (1) 編輯
【Java基礎專題】IO與文件讀寫---使用Apache commons IO過濾文件和目錄
摘要: 它們可以分為兩大類:
①實質(zhì)性過濾器:例如針對文件的類型,屬性,名稱,大小進行過濾的過濾器
②過濾器連接器:典型的包括AndFileFilter、OrFileFilter。用于邏輯連接多個過濾器
閱讀全文
posted @
2010-03-09 00:02 Paul Lin 閱讀(1358) |
評論 (0) 編輯
【Java基礎專題】IO與文件讀寫---使用Apache commons IO簡化文件讀寫
摘要: FileUtils總體上來說,主要功能有:
※ 資源的創(chuàng)建、刪除
※ 資源的復制、移動
※ 資源的讀寫
※ 資源的比較
※ 資源的過濾
※ 資源的轉(zhuǎn)換
閱讀全文
posted @
2010-03-08 15:07 Paul Lin 閱讀(6584) |
評論 (1) 編輯
【Java基礎專題】IO與文件讀寫---使用Apache commons io包提高讀寫效率
摘要: 本文通過對Apache commons io包的input,output子類的源代碼研究,來揭示為什么使用commons IO包會在性能上由于JDK自帶的IO類。
特別是輸出流方面
閱讀全文
posted @
2010-03-04 10:28 Paul Lin 閱讀(5653) |
評論 (0) 編輯
【Java基礎專題】IO與文件讀寫---Java的IO流架構(gòu)
摘要: 使用圖例全面展示Java中IO的架構(gòu),特別是節(jié)點流和過濾流及其之間的轉(zhuǎn)換
閱讀全文
posted @
2010-03-02 09:47 Paul Lin 閱讀(4331) |
評論 (3) 編輯
【Java基礎專題】編碼與亂碼(08)---JavaEE防止中文亂碼的設置
摘要: 良好的編程習慣,對編碼和數(shù)據(jù)傳輸流程的清晰認識,規(guī)范的配置是確保JavaEE應用不會出現(xiàn)亂碼的三大法寶
閱讀全文
posted @
2010-02-24 10:25 Paul Lin 閱讀(4331) |
評論 (1) 編輯
【Java基礎專題】編碼與亂碼(07)---native2ascii命令的用法
摘要: 可以看到該命令對于英文字符,數(shù)字不會轉(zhuǎn)換而是直接輸出,而對于每個中文字符則轉(zhuǎn)換成以\u開頭的4個16進制數(shù)字。
通常情況下,如果要進行字符的逆轉(zhuǎn)換,-encoding encoding_name這個參數(shù)都會配合-reverse出現(xiàn)。在上面的例子中因為本地系統(tǒng)是中文操作系統(tǒng),所以即便沒有指定-encoding也可以正確地從unicode ---》GBK。如果是在英文平臺下由于默認字符集是ISO-8859-1,那么這個時候如果不指定則轉(zhuǎn)換出來的將是?了。
閱讀全文
posted @
2010-02-23 18:41 Paul Lin 閱讀(885) |
評論 (0) 編輯
【Java基礎專題】編碼與亂碼(06)---字符的各種值轉(zhuǎn)換
摘要: 可以看到在Java中,字符的unicode有兩種表示顯示:一種是10進制形式,一種是16進制形式。它們可以分別通過:int i = (int)(string.charAt(i))和Integer.toHexString(i);獲得。而且在java文件和Web頁面,同一個unicode的表示形式是不同。web頁面需要用進行轉(zhuǎn)義,在java文件中則使用\u進行轉(zhuǎn)義。
閱讀全文
posted @
2010-02-23 16:48 Paul Lin 閱讀(2126) |
評論 (2) 編輯
【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉(zhuǎn)換
摘要: 在這個專題的第一篇文章【Java基礎專題】編碼與亂碼(01)---編碼基礎 開頭,我們就已經(jīng)介紹了這個規(guī)則:
①得到每個字符的2進制GBK編碼
②將該16進制的GBK編碼轉(zhuǎn)換成2進制的字符串(2個字節(jié))
③分別在字符串的首位插入110,在第9位插入10,在第17位插入10三個字符串,得到3個字節(jié)
④將這3個字節(jié)分別轉(zhuǎn)換成16進制編碼,得到最終的UTF-8編碼。
閱讀全文
posted @
2010-02-22 23:00 Paul Lin 閱讀(37031) |
評論 (11) 編輯
【Java基礎專題】編碼與亂碼(04)---輸出時的編碼與亂碼
摘要: 謹慎地使用getBytes(NAME_OF_CHARSET)和new String(bytes, NAME_OF_CHARSET),除非你很清楚的知道原始的字符編碼和傳輸協(xié)議使用的編碼。
推薦使用基于服務器的配置、過濾器設置request/response的characterEncoding、content type屬性。還有就是JSP頁面的pageEncoding屬性、HTML meta元素的content type屬性。盡量避免頻繁的在代碼中進行字符串轉(zhuǎn)碼,即降低了效率又增加了風險
閱讀全文
posted @
2010-02-22 17:39 Paul Lin 閱讀(3042) |
評論 (4) 編輯
【Java基礎專題】編碼與亂碼(03)----String的toCharArray()方法
摘要: 這個方法再次證明了String的getBytes()方法的危險性,如果我們使用new String(str.getBytes(), encoding)對字符串進行重新編碼解碼時,我們一定要清楚str.getBytes()方法返回的字節(jié)數(shù)組的長度、內(nèi)容到底是什么,因為在接下來使用新的encoding進行編碼解碼時,Java并不會自動地對字節(jié)數(shù)組進行擴展以適應新的encoding。而是按照新的編碼方法直接對該字節(jié)數(shù)組進行解析。
于是結(jié)果就像上面的例子一樣,同樣是4個原始字節(jié),有些每2個一組進行解析,有些每個一組進行解析,有些每3個一組進行解析。其結(jié)果就只能看那種編碼方式合適了。
閱讀全文
posted @
2010-02-22 17:18 Paul Lin 閱讀(7103) |
評論 (2) 編輯
【Java基礎專題】編碼與亂碼(02)---String的getBytes([encoding])方法
摘要: 不要輕易地使用或濫用String類的getBytes(encoding)方法,更要盡量避免使用getBytes()方法。因為這個方法是平臺依賴的,在平臺不可預知的情況下完全可能得到不同的結(jié)果。如果一定要進行字節(jié)編碼,則用戶要確保encoding的方法就是當初字符串輸入時的encoding。
閱讀全文
posted @
2010-02-22 16:53 Paul Lin 閱讀(4601) |
評論 (1) 編輯
【Java基礎專題】編碼與亂碼(01)---編碼基礎
摘要: Unicode到UTF-8的轉(zhuǎn)換:Unicode的16進制編碼<-->對應的2進制編碼<-->UTF-8規(guī)范的2進制編碼<-->UTF-8規(guī)范的16進制編碼
也就是說,假如我們需要從磁盤文件、數(shù)據(jù)庫記錄、網(wǎng)絡傳輸一些字符,保存到Java的變量中,要經(jīng)歷由bytes-->encode字符-->Unicode字符的轉(zhuǎn)換(例如new String(bytes, encode));而要把Java變量保存到文件、數(shù)據(jù)庫或者通過網(wǎng)絡傳輸,系統(tǒng)要做一個Unicode字符-->encode字符-->bytes的轉(zhuǎn)換(例如String.getBytes([encode]))
閱讀全文
posted @
2010-02-16 23:23 Paul Lin 閱讀(3682) |
評論 (3) 編輯
【原】RSS工具開發(fā)手記(14)---Informa的exporters包
摘要: Informa不僅提供了對不同版本的RSS Feed source的讀入和解析,同樣也提供了將channel object導出為不同協(xié)議版本的XML文件的功能。這個功能是通過exporters包下的各個導出類來完成的。目前僅支持對RSS協(xié)議的導出,不支持Atom協(xié)議、OPML協(xié)議的導出。
閱讀全文
posted @
2010-01-04 10:15 Paul Lin 閱讀(406) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(13)---Informa的parsers包
摘要: OPML(Outline Processor Markup Language)協(xié)議正是用于解決這樣問題的。利用OPML協(xié)議,我們可以通過閱讀器把已經(jīng)訂閱的頻道導出為OPML協(xié)議規(guī)定的格式,從而作為
一個文件分享出去。
閱讀全文
posted @
2010-01-02 20:56 Paul Lin 閱讀(345) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(12)---Informa的parsers包
摘要: 可以看到,對于這個解析過程,一般的步驟就是:
A.獲取channnel下的某個子節(jié)點元素
B.如果該子節(jié)點元素有子元素或?qū)傩裕瑒t繼續(xù)遞歸訪問
C.調(diào)用該channnel子元素的createXxx方法加載或創(chuàng)建該子元素
D.調(diào)用Channel的setXxx方法添加該子元素到channel實例中
閱讀全文
posted @
2009-12-30 10:45 Paul Lin 閱讀(252) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(11)---Informa的parse包
摘要: FeedParser是一個facade類,這個類的工作就是根據(jù)讀入的RSS Feed的協(xié)議系和版本“委托(delegate)”給已經(jīng)硬編碼的規(guī)則(concrete rules)指定的解析器,而且這些解析器是私有的。這意味著:用戶不能直接調(diào)用一個RSS_0_91_Parser類的實例來進行解析工作。
閱讀全文
posted @
2009-12-29 15:56 Paul Lin 閱讀(1488) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(10)---Informa的impl.hibernate包
摘要: ChannelBuilder對channel object的創(chuàng)建原則就是:
A.如果能夠從持久層中找到對應的記錄,那么從持久層返回
B.如果找不到,則創(chuàng)建它并持久化它,然后返回該對象(已持久化)
只要記得的一點就是:從ChannelBuilder返回的對象都是已經(jīng)持久化的。
閱讀全文
posted @
2009-12-28 15:57 Paul Lin 閱讀(1240) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(07)---Informa的impl.basic包
摘要: 這個ID生成類采用了系統(tǒng)當前時間作為隨即數(shù)產(chǎn)生的種子,這個并不難理解。但是有一個地方需要我們注意的就是關鍵字transient的使用。這個關鍵的作用是告訴編譯器假設該類的對象被序列化了,這個值不需要被保存。因為它是“瞬時”的。
閱讀全文
posted @
2009-12-23 00:03 Paul Lin 閱讀(1338) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(05)---Informa的impl.basic包
摘要: 總結(jié)起來,channel的創(chuàng)建,更新過程如下:
①接收經(jīng)過ChannelParser解析后的XML Element元素,和其他一系列屬性,調(diào)用構(gòu)造方法
②構(gòu)造方法為channel生成一個全局唯一ID
③構(gòu)造方法創(chuàng)建item列表,觀察者列表,設置好分類(Category),首次更新時間
④如果有新item到來,則添加到item列表,同時更新item的channel歸屬
⑤如果現(xiàn)有channel更新,則設置最新更新時間
⑥通知每一個已注冊的觀察者有事件發(fā)生
閱讀全文
posted @
2009-12-22 23:31 Paul Lin 閱讀(1257) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(04)---Informa的core包
摘要: Informa的core包介紹如下:
“This package contains interfaces for the news channel objects, it builds the core API for all news channel storage implementation. ”
從上面這句話來看,core包里面定義的都是關于“news channel objects”的接口---實際上就是RSS協(xié)議中的channel和item元素。經(jīng)過一個多小時查看源代碼和閱讀API,發(fā)現(xiàn)Informa對core包的設計有如下特點:
core包中的元素被分為標記接口、實體接口、行為接口
閱讀全文
posted @
2009-12-21 22:09 Paul Lin 閱讀(1246) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(03)---初始Informa
摘要: Informa的API結(jié)構(gòu)如下:
★core包:
核心包。訂閱了RSS中channel,item等一系列元素和元數(shù)據(jù)的接口
★impl.basic包:
基本功能包。使用in-memory模式實現(xiàn)了core包訂閱的接口
★impl.hibernate包:
基于hibernate實現(xiàn)的包,使用關系型數(shù)據(jù)庫模式實現(xiàn)了core包定義的接口
★parsers包:
定義了永遠解析channel,item的解析器工具
★exporters包:
定義了一組把channel,item導出成各種協(xié)議格式的工具
★search包:
定義了用于全文搜索channel,item的工具
★utils.manager.memory包:
定義了一組用于管理“in-memory”模式持久化的工具
★utils.manager.hibernate包:
閱讀全文
posted @
2009-12-21 15:39 Paul Lin 閱讀(1259) |
評論 (0) 編輯
【原】RSS工具開發(fā)手記(02)---工欲善其事,必先利其器
摘要: 選擇一個開源框架,我的標準有幾條:
★良好的文檔和源代碼管理:這是最基本的一條,想RSSLibJ這種連文檔、官網(wǎng)都沒有的一律pass掉
★持續(xù)的改進:這是第二個重要的,像上面某些工具從02年后就不再更新了,出了問題你找誰訴苦去
★簡單和易上手:在短時間內(nèi)可以迅速依樣畫葫蘆
★活躍的社區(qū):參與的人越多軟件成長得越多。我不是特別在乎軟件目前的使用率,因為好的軟件都是慢慢出名的
閱讀全文
posted @
2009-12-21 11:52 Paul Lin 閱讀(1362) |
評論 (0) 編輯
【原】Java 多線程 之 ThreadLocal
摘要: ThreadLocal作用解析及代碼實例
閱讀全文
posted @
2008-09-05 17:10 Paul Lin 閱讀(4752) |
評論 (1) 編輯
【原】多線程編程的基礎知識點
摘要: 【一】進程、線程、并發(fā)執(zhí)行
【二】JVM與多線程
【三】Java語言對多線程的支持
【四】線程的狀態(tài)切換
【五】Java中線程的調(diào)度API
【六】參考文章
閱讀全文
posted @
2008-09-02 10:50 Paul Lin 閱讀(3908) |
評論 (3) 編輯
【轉(zhuǎn)】Dom4j中自帶的教程
摘要: 來自Dom4j中的cookbook
閱讀全文
posted @
2008-01-30 17:13 Paul Lin 閱讀(2247) |
評論 (0) 編輯