759 字
4 分鐘
【閒聊】把「檔案列表與比對工具」丟上 GitHub
寫了一個自己要用的小工具——「檔案列表與比對工具」,作為作品集、丟上 GitHub 好了……不過這樣就必須要把很多地方改善了 www。
檔案列表與比對工具
開發動機
最近和家人在整理家裡的檔案庫……,之前備份來、備份去,然後又改來改去,導致有些資料夾內大致相同、但哪裡有一點點不同。
人工找感覺好麻煩,於是想說來寫個程式把那些不共通的部分抓出來吧。
目前做到哪了?
其實我是先開發了「列表」功能,本來想根據列出來的 txt 檔再做比對;但是後來做「比對」功能時,想說這樣反而要跑兩次 IO,不如在讀取資料夾內資訊時順便搞定。
剛剛為了要丟上 GitHub,才開始開新專案(本來只是在自己的練習專案裡開個 package 寫),重新整理一下程式結構;想說「列表」功能乾脆等之後程式碼重構完再來整理好了,於是現在放上去的只有「比對」功能。
印象深刻的挑戰
isDirectory()
為true
、但是listFiles()
的結果不是空陣列而是null
?- 理論上,即使是空的資料夾,
listFiles()
的回傳結果應該會是空陣列(length
為0
)、而不會是null
- 發現是「$RECYCLE.BIN」這種系統資料夾……;好吧,記起來,要多做這種判斷。
- 理論上,即使是空的資料夾,
接下來想做什麼?
都寫在 README.md
的「待開發」了。
- 想搬去其他電腦用,所以還是得做介面、打包
- 如果能的話,也想做給家人使用——那樣肯定是要做 GUI 了。
- 把輸出邏輯交給另一個執行緒
- 現在輸出成 txt 檔的實現方式是類似於把每一行東西放進一個 List 裡面,最後交給輸出 method 去跑 for-each
- 後來想優化一些小地方,發現沒辦法即時寫入輸出檔……
- 想在程式一開始運行時就把時間記錄下來,這樣才能知道這次比對共跑了多久
- 如果有發生錯誤,像是無法讀取等等,也想寫進輸出檔、類似 log 的概念
- 如何實現?
- 問 ChatGPT、得知了
BlockingQueue
這個好東西,就像是 Message Queue 的概念 - 實作還有分
ArrayBlockingQueue
和LinkedBlockingQueue
- 不過不像 List 那樣、在增刪時會有時間複雜度的差距,在這裡都是 O(1)
ArrayBlockingQueue
以「Circular Array」實現,並有兩個索引指針分別指向頭尾兩端LinkedBlockingQueue
以雙向鏈表實現,每個元素會包含上一個元素和下一個元素的指標;也有兩個索引指針分別指向頭尾兩端
- 比較
ArrayBlockingQueue
- 必須在宣告時固定大小,如果內容已滿、會導致 Producer 阻塞
LinkedBlockingQueue
- 因為是鏈表、占用記憶體會較大一點點
- 可以不固定大小,就不用怕 Producer 速度較快、被阻塞
- 不過不像 List 那樣、在增刪時會有時間複雜度的差距,在這裡都是 O(1)
- 問 ChatGPT、得知了