從零開始的自己制作桌面清理軟件(二)

在上一章,我們理清了有哪些該清理的文件,事實上,還有很多文件是可以清理的,如下是百度搜索"垃圾文件給出的定義":

在Windows操作系統(tǒng)安裝和使用過程中都會產(chǎn)生相當多的垃圾文件,
包括臨時文件(如:*.tmp瓤摧、*._mp)日志文件(*.log)摇零、
臨時幫助文件(*.gid)、磁盤檢查文件(*.chk)、
臨時備份文件(如:*.old、*.bak)以及其他臨時文件。
特別是如果一段時間不清理IE的臨時文件夾“Temporary Internet Files”席揽,其中的緩存文件有時會占用上百MB的磁盤空間。
這些垃圾文件不僅僅浪費了寶貴的磁盤空間谓厘,嚴重時還會使系統(tǒng)運行慢如蝸牛幌羞。
這點相信你肯定忍受不了吧!所以應及時清理系統(tǒng)的垃圾文件的淤塞竟稳,保持系統(tǒng)的“苗條”身材属桦,輕松流暢上網(wǎng)!

關于其他可清理文件類型日后再談,在這一章我們主要要了解的是,怎么清理?

方案一:寫個批量操作的bat文件,然后雙擊食用.(正如百度百科詞條下那個例子)
方案二:使用一門熱門的編程語言編寫一個含有GUI操作和眾多自定義條目的桌面應用程序.

當然了,我們毫無理由再做方案一這種重復而且沒有挑戰(zhàn)的事情.
那么既然我們選擇了方案二,那么就用JAVA編寫清理內(nèi)核,JAVAFX編寫GUI吧!

筆者決定從處理垃圾文件的內(nèi)核開始從內(nèi)向外的編寫,所以現(xiàn)在我們需要完成的功能是編寫清理器類,稍微思考構思下,可以想到我們未來的內(nèi)核可能是這樣分布的:

image.png

Reader類負責讀取文件結(jié)構,
SuffixFilter類負責篩選所需要的特定文件類型,
Cleaner類負責遍歷文件結(jié)構清理.

先編寫Reader,思路是使用listFile方法,遍歷文件,然后進行迭代來深度遍歷找出所有文件出來.

    /**
     * 得到過濾器下的淺度搜索目標文件下的所有文件
     * 
     * @param path
     *            文件地址字符串
     * 
     * @return 正常文件夾返回文件列表,空文件夾和文件返回空數(shù)組,地址不存在返回空
     */
    public File[] getFiles(String path) {
        File file = new File(path);
        if (file.exists()) {
            if (file.isFile()) {
                return new File[0];
            }
            else {
                return file.listFiles();
            }
        }
        else {
            return null;
        }
    }
    /**
     * 得到過濾器下的深度搜索目標文件下的所有文件
     * 
     * @param path
     *            文件地址字符串
     * 
     * @return 一個存放所有文件集合的HashMap
     */
    public HashMap<File, File[]> getAllFiles(String path) {
        File[] files = getFiles(path);
        this.fileMap.put(new File(path), files);
        // 如果路徑不存在或者是空文件夾或文件,則跳出遞歸
        if (files != null && files.length != 0) {
            for (File file : files) {
                getAllFiles(file.getPath());
            }
        }
        return this.fileMap;
    }

這里筆者使用了HashMap存儲文件結(jié)構.它能讓我清晰的知道哪個文件夾對應的哪些子文件,其中父文件是key,然后子文件們的數(shù)組是value.

以上代碼基本就是Reader類的核心,現(xiàn)在我們要思索下我們這個Reader類應該具備哪些屬性,也就是說,我們需要的哪些數(shù)據(jù)是應該存儲到Reader類的?這直接影響了構造函數(shù)和字段.

首先是文件結(jié)構HashMap要當做這個類的字段的,這也是這個類存在的原因之一.另外,Reader也不是瞎Read,起碼得知道我需要從哪讀取,讀取什么?

事實上,這是兩個問題,首先是從哪讀取,我們大可用字符串來構造這個"哪"字,比如C盤:"C:/".然后是讀取什么,這也很關鍵,我們需要清理的是一個垃圾文件的集合,如果所有的文件全部讀取出來然后清除大概又要參考我的第一篇文章重裝系統(tǒng)了喲.

所以說,我們需要一個過濾器,來過濾出真正的垃圾文件.很幸運,java自己就有這么一個過濾器類:Filter.Filter類里面只有一個方法accept,這個方法返回值是布爾,true代表著通過了過濾,false代表著沒有通過,我們重寫這個方法就可以指定哪些需要過濾哪些不需要了.

這時候我們需要這個SuffixFilter類了.我們利用這個類繼承Filter然后重寫它的方法:

package coreCleaner;

import java.io.*;

/**
 * @author jinshuguangze
 * @version 1.1
 */
public class SuffixFilter implements FilenameFilter {
    // 過濾器集,一般以文件類型作為區(qū)分,比如{".exe"}就是過濾出應用程序的
    private String[] suffix;

    /**
     * 構造函數(shù)
     * 
     * @param suffix
     *            過濾字符串數(shù)組
     */
    public SuffixFilter(String[] suffix) {
        this.suffix = suffix;
    }

    /**
     * 重寫的過濾方法,使用或運算符號得出是否通過
     * 
     * @param dir
     *            要過濾的文件
     * @param name
     *            文件名
     * @return 如果通過過濾就是true,沒有通過就是false
     */
    @Override
    public boolean accept(File dir, String name) {
        boolean pass = false;
        for (int i = 0; i < suffix.length; i++) {
            pass = pass || name.endsWith(suffix[i]);
        }
        return pass;
    }
}

這里面利用了或運算來篩選多個過濾器.

我們其實大可不必專門為它寫個類的,直接使用匿名內(nèi)部類來解決會更方便,不過筆者考慮到程序進一步擴展可能需要指定不同的過濾方案,所以還是把它單獨寫成一個類了.

有了過濾器,我們就能寫一個過濾之前的文件結(jié)構產(chǎn)生新文件結(jié)構的方法了.

    /**
     * 得到過濾器下的文件文件結(jié)構
     *  
     * @param fileMap
     *            文件結(jié)構
     * @return 過濾后的文件結(jié)構
     */
    public HashMap<File, File[]> getFilterFiles(HashMap<File, File[]> fileMap) {
        // 防止一開始給予的路徑就是不存在路徑
        if (fileMap == null) {
            return null;
        }
        fileMap.forEach((k, v) -> {
            // 防止子目錄有不存在路徑
            if (v != null) {
                Vector<File> acceptFile = new Vector<>();
                SuffixFilter filter = new SuffixFilter(suffix);
                for (File file : v) {
                    if (filter.accept(file.getParentFile(), file.getName())) {
                        acceptFile.add(file);
                    }
                }
                // 如果沒有文件滿足過濾器,那么put進去的是個空數(shù)組
                this.fileMapFilter.put(k, acceptFile.toArray(new File[acceptFile.size()]));
            }
        });
        return this.fileMapFilter;
    }

PS:可能其中的filter.accept()會看上去比較愚蠢,因為可以直接利用邏輯關系寫個方法就行了而不用專門寫個類,不過筆者還是堅信在發(fā)展中,需求會越來越膨脹的,而且file.listFiles()方法里面可以直接加這個Filter參數(shù),效果會很好:\

這時候我們很明確的知道我們需要的字段有:需要從哪處理的根目錄,過濾器,根目錄下所有文件集,過濾器下所有文件集.(事實上能從上面的代碼中看出來,這是因為筆者提前寫好代碼的原因,如果不知道這點的話還是得花點時間來思索考量的)

這時我們的Reader類基本只差一些零零散散的setter,getter了.值得注意的是,關于setter筆者只開放了過濾器的setter,代碼是這樣的:

    /**
     * 設置過濾器
     * 
     * @param suffix
     */
    public void setSuffix(String... suffix) {
        this.suffix = suffix;
        getFilterFiles(this.fileMap);
    }

這是由于文件結(jié)構讀取出來了,可以快速的更換過濾器來求出它的子集,而開放其余幾個字段是毫無意義的.

值得一提的是,在構造器方面,為了保證這個類每次構造出新的對象就直接讀取,可以直接在構造器中加方法:

    /**
     * 構造函數(shù)
     * 
     * @param rootPath
     *            根文件地址字符串
     * @param suffix
     *            過濾字符串數(shù)組
     */
    public Reader(String rootPath, String... suffix) {
        this.rootPath = rootPath;
        this.suffix = suffix;
        getFilterFiles(getAllFiles(rootPath));
    }

這個文章過后我們基本把過濾器類和讀取類寫完了,下篇文章我們討論清除類和其他一些類的思路.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末住练,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子愁拭,更是在濱河造成了極大的恐慌讲逛,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岭埠,死亡現(xiàn)場離奇詭異盏混,居然都是意外死亡,警方通過查閱死者的電腦和手機惜论,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門许赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馆类,你說我怎么就攤上這事混聊。” “怎么了乾巧?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵句喜,是天一觀的道長预愤。 經(jīng)常有香客問我,道長咳胃,這世上最難降的妖魔是什么植康? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮展懈,結(jié)果婚禮上销睁,老公的妹妹穿的比我還像新娘。我一直安慰自己存崖,他們只是感情好冻记,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著金句,像睡著了一般檩赢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上违寞,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天贞瞒,我揣著相機與錄音,去河邊找鬼趁曼。 笑死军浆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的挡闰。 我是一名探鬼主播乒融,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摄悯!你這毒婦竟也來了赞季?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奢驯,失蹤者是張志新(化名)和其女友劉穎申钩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘪阁,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡撒遣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了管跺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片义黎。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖豁跑,靈堂內(nèi)的尸體忽然破棺而出廉涕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布火的,位于F島的核電站壶愤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏馏鹤。R本人自食惡果不足惜征椒,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湃累。 院中可真熱鬧勃救,春花似錦、人聲如沸治力。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宵统。三九已至晕讲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間马澈,已是汗流浹背瓢省。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痊班,地道東北人勤婚。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像涤伐,于是被迫代替她去往敵國和親馒胆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理凝果,服務發(fā)現(xiàn)祝迂,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 本文包括:1器净、Filter簡介2型雳、Filter是如何實現(xiàn)攔截的?3掌动、Filter開發(fā)入門4四啰、Filter的生命周期...
    廖少少閱讀 7,276評論 3 56
  • 從三月份找實習到現(xiàn)在宁玫,面了一些公司粗恢,掛了不少,但最終還是拿到小米欧瘪、百度眷射、阿里、京東、新浪妖碉、CVTE涌庭、樂視家的研發(fā)崗...
    時芥藍閱讀 42,253評論 11 349
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件欧宜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 第二章:出嫁…… 雪坐榆?!竟然下雪了冗茸!蘇璃站在窗前席镀,看著漫天飛舞的大雪。一個飛身落到園中夏漱,伸手接住一片雪花豪诲,黑紗包...
    裘戀閱讀 254評論 0 0