everything
1、項目描述
基於Java語言,模仿Linux下的find命令,實現windows下命令行的查找文件的功能,由於是Java語言開發,所以也具有跨平臺性
2、項目背景
在Linux下的find命令很好用,但是在windows下查找文件卻不是那麼方便,在windows界面查找速度非常慢而且還不能跨盤查找,因此開發這款命令行的查找工具,可以在windows下快速全盤查找。
3、使用到的技術
-
JavaSE基礎(文件操作)
-
Database(嵌入式H2數據庫或MySQL)
-
JDBC
-
Lombok庫(IDEA工具安裝Lombok插件)
-
Java多線程技術
-
文件系統監控(Apache Commons IO)
-
pinyin4j (支持拼音搜索)
-
設計模式(單例模式)
4、項目結構圖
項目採用分層結構,如下圖:
5、各個模塊簡單說明
5.1 模型
enum FileType 文件類型
class Condition 檢索文件的條件的模型類
class Thing 存入數據庫的一行
5.2 數據庫操作
1) 數據源 通過單例模式,獲取數據源
2)使用JDBC對數據庫中的文件進行增、刪、查
5.3業務層操作
1)創建索引
-
通過遞歸的方式遍歷一個文件夾下的所有文件
-
將一個電腦上的文件類型轉化爲數據庫中的一個Thing(將文件信息轉換爲一個Thing的對象類型)
-
判斷文件是否是要處理的目錄(定義了默認要查找的目錄和默認忽略的目錄,像C:\windows 之類的系統文件就可以忽略)
-
通過FileSystems.getDefault().getRootDirectories(); 來獲取次電腦上有哪些盤(C:\\ D:\\ E:\\)
-
電腦有幾個盤,就創建幾個線程,每個線程遍歷一個盤
-
用CountDownLatch來控制多線程,等幾個線程都執行完之後提示用戶,索引創建完畢
2)查找文件
-
通過查詢條件,調用數據庫的查詢方法,獲取查詢結果
-
判斷查詢結果中的文件是否還存在,如果出查詢出來的文件在電腦上已經被刪除了,就把該文件從查詢結果集中刪除,同時,把它放在一個後臺清理的隊列中,在後臺刪除數據庫中不存在的文件(因爲從結果集中刪除一個元素是CPU操作,而從數據庫中刪除是IO操作,CPU操作比IO操作快的多,所以這裏把它放在後臺刪除,就像生產者,消費者模型)
3)文件監聽
-
JDK7中提供的WatchService也可以實現系統文件的監控,但是由於這個使用方法只能對一個目錄下的文件進行監控,而不能對目錄下的子目錄繼續監控,所以沒有使用這個方法。
-
通過使用第三方jar包commons-io 中的類和方法進行文件監控。
-
自己寫一個類 繼承FileAlterationListenerAdaptor類,覆寫裏面的部分方法(文件創建、文件刪除、目錄創建、目錄刪除),用來對系統文件進行監聽(其中FileAlterationMonitor實現了Runnable接口,因此是自己在後臺進行監聽),在程序啓動的時候就調用文件監聽的方法在後臺監聽
-
將監聽到的文件變化(增加、刪除)信息寫入到一個txt文件中,同時,如果有文件新增,就將新增的文件寫入數據庫,如果文件刪除,就刪除數據庫中對應的文件
4)攔截器
因爲在遍歷系統文件的時候,我們還會對文件進行一些操作,比如:打印文件信息,將文件信息插入到數據庫中,刪除文件從數據庫中刪除等操作,這些操作又相互不影響,所以可以將它們單獨提取出來,作爲一個獨立的方法,叫做攔截器,在需要對應的操作的時候只需要調用對應的攔截器即可。
5.4 控制層
1)對之前的業務方法進行統一的調度;
2)通過配置文件的方式,讀取一些參數信息(比如:查詢的結果最多返回的數量,對查詢結果的排序方式(按深度/按查找名稱的相似度), 是否程序一運行就創建索引(默認不創建),進行文件系統監控的時間間隔,默認要查找的目錄,默認要排除的目錄(有些系統目錄可以不用查找))
5.5 命令行交互
通過對用戶輸入的字符串進行處理,判斷用戶具體想幹什麼,最後去控制層調用對應的業務方法.
6 使用介紹
方式1:項目寫完之後,使用maven工具打包,可以直接在命令行運行 .jar程序
maven打包:
運行結果:
方式2 :後來,我又對運行方式進行了優化,內置jre運行環境
將lib目錄(裏面放的是項目中需要導入的依賴jar包) 和 自己打的項目jar包, classes目錄拷到一個文件中,然後將自己裝的jre的所有目錄拷貝到同一個目錄下,然後寫一個簡單的.bat文件(run.bat),run.bat文件內容如下:
start jre/bin/java -jar find_in_windows-1.0.0.jar
最後目錄結構如下:
最後將這個文件壓縮,使用的時候只需要將文件解壓,雙擊run.bat文件即可(windows環境下的),運行結果:
7、運行結果展示
拼音搜索:
打開文件:
查詢:
根據文件名稱-類型查詢:
最後,我把源代碼都放到了github上,地址爲:https://github.com/feihhh/myFind